hac*_*ket 8 mysql sql select datetime 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 ))
Run Code Online (Sandbox Code Playgroud)
这将从我的表中选择ALL BUT最近添加的用户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 ))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误 - >
#1411 - Incorrect datetime value: 'Mon Mar 14 16:10:10 CDT 2011' for function str_to_date
Run Code Online (Sandbox Code Playgroud)
原因是我的时间戳以两种格式存储.一个将在非夏令时期间存储为"CST",另一个将在夏令时期间存储为"CDT".当INSERT INTO SELECT获取到有什么,我对查询的对面的第一行,它会失败,上述消息.
我也尝试过COALESCE,它们在运行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 ))
Run Code Online (Sandbox Code Playgroud)
为什么这会在INSERT上失败,但SELECT会起作用?
我认为 INSERT 失败,因为您没有使用受支持的格式。支持的格式。。。
\n\n\n\n作为 \'YYYY-MM-DD HH:MM:SS\' 或 \'YY-MM-DD HH:MM:SS\'\n 格式的字符串。这里也允许使用 \xe2\x80\x9crelaxed\xe2\x80\x9d 语法:任何标点符号都可以用作日期部分或时间部分之间的分隔符。例如,\'2012-12-31 11:30:45\', \'2012^12^31 11+30+45\',\n \'2012/12/31 11*30*45\',和“2012@12@31 11^30^45”是等价的。
\n\n作为不带分隔符的字符串,采用 \'YYYYMMDDHHMMSS\' 或\n \'YYMMDDHHMMSS\' 格式,前提是该字符串作为日期有意义。\n 例如,\'20070523091528\' 和 \'070523091528\' 是解释为\n \'2007-05-23 09:15:28\',但 \'071122129015\' 是非法的(它有\n 无意义的分钟部分)并变为\'0000-00-00 00:00: 00'。
\n\n采用 YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字,前提是该数字作为日期有意义。例如,19830905132800 和\n 830905132800 被解释为“1983-09-05 13:28:00”。
\n
| 归档时间: |
|
| 查看次数: |
6278 次 |
| 最近记录: |