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

时间:2012-08-30 13:45:27

标签: mysql sql datetime select insert

这些查询需要字符串到日期转换,因为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 ))

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

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

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 ))

我收到以下错误 - &gt;

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

之所以这样,是因为我的时间戳以两种格式存储。一个人将存储为CST&#39;在非夏令时期间,另一方将存储为CDT&#39;在夏令时期间。当INSERT INTO SELECT到达与我查询的相反的第一行时,它将失败并显示上述消息。

我也尝试过对它们进行COALESCE,这也适用于运行select - &gt;

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会起作用?

1 个答案:

答案 0 :(得分:0)

我认为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'。