我有一个名为Timestamp的字段,它将其值存储为文本而不是实际的时间戳。不幸的是,日志记录应用程序是不可更改的。
所以
table.Timestamp -> text field with format -> "Wed Mar 02 13:28:59 CDT 2011"
我一直在开发一个查询来清除除最近一行之外的所有行,使用它作为我的Timestamp选择器,它也将字符串转换为日期 - >
MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CDT %Y' )
我的查询完美无缺......
然而,我发现的是字符串值 - > 'CDT' - > 'CDT'和'CST'之间的变化取决于当前时间是否为夏令时。在夏令时期间,它会记录为“CDT”,反之亦然。
因此,当我运行此选项时,所有包含'CST'的行都会被忽略 - >
MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CDT %Y' )
当我运行这个时,和包含'CDT'的所有行都会被忽略 - >
MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CST %Y' )
有没有办法让它针对两种字符串格式运行?
编辑 -
因此给出了以下数据(仅与'CDT和'CST'不同:
"Wed Mar 02 13:28:59 CDT 2011" and "Tue Mar 08 09:42:07 CST 2011"
目前它将返回如下:
MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ) Returns - Wed Mar 02 13:28:59 CDT 2011
MAX( STR_To_DATE( table.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) Returns - Tue Mar 08 09:42:07 CST 2011
我想让它返回“Tue Mar 08 09:42:07 CST 2011”,无论如何。
编辑2:
这是我的主要问题:
DELETE
FROM `table` main
WHERE STR_To_DATE( main.Timestamp , '%a %b %d %H:%i:%s CST %Y' ) <
(SELECT 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 `table` sub
WHERE sub.Retrieving_User = main.Retrieving_User )
答案 0 :(得分:2)
合并两者。 COALESCE
表示返回集合中的第一个非空值。
在这种情况下,它将首先尝试使用“CDT”解析它。如果失败,返回NULL,它将尝试使用“CST”进行解析。 (如果失败,它将到达coalesce列表的末尾并返回NULL,但在你的情况下它不会那么远)。
select MAX( COALESCE(STR_To_DATE( test.Timestamp , '%a %b %d %H:%i:%s CDT %Y' ), STR_To_DATE( test.Timestamp , '%a %b %d %H:%i:%s CST %Y' )))
from test
SQL Fiddle尝试更改表格中的数据并查看其是否有效。