#1411 - INSERT INTO...SELECT 上函数 str_to_date 的日期时间值不正确

Posted

技术标签:

【中文标题】#1411 - INSERT INTO...SELECT 上函数 str_to_date 的日期时间值不正确【英文标题】:#1411 - Incorrect datetime value for function str_to_date on INSERT INTO...SELECT 【发布时间】:2012-08-25 06:25:01 【问题描述】:

这些查询需要字符串到日期的转换,因为时间戳存储为字符串,并且日志记录应用程序是不可更改的。

我有一个完美运行的选择查询 ->

(SELECT main.user_id, main.Timestamp
FROM `user_table` main
WHERE STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) <
  (SELECT  MAX(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' )) 
   FROM `user_table` sub
   WHERE sub.user_id = main.user_id ))

这将从我的表中选择所有但最近添加的用户 ID 和时间戳。

但是,当我尝试将其插入另一个表时......就像这样 ->

INSERT INTO user_table_temp (`user_id`, `Timestamp`)
(SELECT main.user_id, main.Timestamp
FROM `user_table` main
WHERE STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) <
  (SELECT  MAX(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' )) 
   FROM `user_table` sub
   WHERE sub.user_id = main.user_id ))

我收到以下错误 ->

#1411 - Incorrect datetime value: 'Mon Mar 14 16:10:10 CDT 2011' for function str_to_date

这是因为我的时间戳以两种格式存储。一个将在非夏令时存储为“CST”,另一个将在夏令时存储为“CDT”。当 INSERT INTO SELECT 到达与我查询的内容相反的第一行时,它将失败并显示上述消息。

我也尝试过合并它们,这在运行 select 时也有效 ->

INSERT INTO user_table_temp  (`user_id `, `Timestamp`)
(SELECT main.user_id , main.Timestamp
FROM `user_table` main
WHERE COALESCE(STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ), STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' )) <
  (SELECT  MAX(COALESCE(STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ), STR_To_DATE( sub.Timestamp , '%a %b %d %H:%i:%s CST %Y' ))) 
   FROM `user_table` sub
   WHERE sub.user_id = main.user_id ))

为什么这会在 INSERT 上失败,但 SELECT 会起作用?

【问题讨论】:

试试CAST(STR_TO_DATE(...) AS DATETIME) 看看会发生什么。 @hacket 我认为这很愚蠢,但在 sql-server 中会报错。您是否尝试过不使用 () 进行插入?我的意思是,插入字段中选择..如果可行,我会将其作为答案 @ElVieejo 刚刚尝试过,我得到了同样的错误。这可能是 mysql 的错误吗? @hacket 您收到错误或警告了吗? @Devart 我不确定,我需要再次运行它。有区别吗? 【参考方案1】:

我认为它在 INSERT 上失败,因为您没有使用 a supported format。支持的格式。 . .

作为 'YYYY-MM-DD HH:MM:SS' 或 'YY-MM-DD HH:MM:SS' 中的字符串 格式。这里也允许使用“宽松”的语法:任何标点符号 字符可用作日期部分或时间之间的分隔符 部分。例如,'2012-12-31 11:30:45'、'2012^12^31 11+30+45'、 '2012/12/31 11*30*45' 和 '2012@12@31 11^30^45' 是等价的。

作为在 'YYYYMMDDHHMMSS' 或 'YYMMDDHHMMSS' 格式,前提是该字符串作为日期有意义。 例如,“20070523091528”和“070523091528”被解释为 '2007-05-23 09:15:28',但 '071122129015' 是非法的(它有 无意义的分钟部分)并变为“0000-00-00 00:00:00”。

作为 YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字,提供 这个数字作为一个日期是有意义的。例如,19830905132800 和 830905132800 被解释为 '1983-09-05 13:28:00'。

【讨论】:

我并没有真正关注您的回答...您的意思是因为格式中包含 CST 和 CDT? @hacket:是的。它也有“星期一”。这些都没有出现在支持的格式中。 这是唯一对我有意义的事情。无论我做什么,它都行不通。我们只是要使用 Excel 来删除重复项,就这么粗略......

以上是关于#1411 - INSERT INTO...SELECT 上函数 str_to_date 的日期时间值不正确的主要内容,如果未能解决你的问题,请参考以下文章

何时用撇号包围 SQL 字段?

NHibernate 数字格式问题 - 我在哪里设置文化?

myBatis Generator - 如何仅生成选择/更新/插入/删除 SQL?

在 Meteor 或 Node 中批量插入 mongodb

UVA1411 Ants

九度 题目1411:转圈