0

我有一个名为 Timestamp 的字段,它将其值存储为文本,而不是实际的 Timestamp。不幸的是,日志记录应用程序是不可更改的。

所以

table.Timestamp -> text field with format -> "Wed Mar 02 13:28:59 CDT 2011"

我一直在开发一个查询来清除除最近行之外的所有行,使用它作为我的时间戳选择器,它也将字符串转换为日期->

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 )
4

1 回答 1

2

将两者结合起来。COALESCE表示返回集合中的第一个非空值。

在这种情况下,它将首先尝试使用“CDT”对其进行解析。如果失败,返回 NULL,它将尝试使用“CST”进行解析。(如果失败,它将到达合并列表的末尾并返回 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尝试更改表中的数据并查看它是否有效。

于 2012-08-29T15:37:31.947 回答