8

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

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

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

4

1 回答 1

0

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

作为 '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”。

于 2012-08-30T19:49:54.100 回答