【发布时间】: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 我不确定,我需要再次运行它。有区别吗?
标签: mysql sql datetime select insert