#1411 - 对INSERT INTO功能STR_TO_DATE不正确的时间值... SELEC

2019-09-21 23:30发布

这些查询要求的字符串到日期的转换,因为时间戳存储为一个字符串,记录应用程序是不可改变的。

我有一个完美的作品选择查询 - >

(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获取到有什么,我对查询的对面的第一行,它会失败,上述消息。

我也曾尝试凝聚他们,这也正好工作在运行时选择 - >

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会的工作?

Answer 1:

我想是因为你不使用INSERT上失败了支持的格式 。 支持的格式。 。 。

如在一个字符串 'YYYY-MM-DD HH:MM:SS' 或 'YY-MM-DD HH:MM:SS' 格式。 A“宽松”的语法如下允许的,太:任何标点符号可以用作日期部分或时间部分之间的分隔符。 例如, '2012-12-31 11时三十分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九时15分​​28秒”,而是“071122129015”是非法的(它有一个无意义的分钟部分)和变为“0000-00-00 00: 00:00' 。

如在任一YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数,条件是该数目是有意义的日期。 例如,19830905132800和830905132800被解释为“1983年9月5日13点28分00秒”。



文章来源: #1411 - Incorrect datetime value for function str_to_date on INSERT INTO…SELECT