2012-08-29 81 views
0

我有一個名爲Timestamp的字段,它將其值存儲爲文本而不是實際的時間戳。不幸的是,日誌記錄應用程序是不可更改的。mysql日期格式與更改字符串值

所以

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 CST %Y') 
- 包含「CDT」當我運行這個被忽略>

MAX(STR_To_DATE(table.Timestamp , '%a %b %d %H:%i:%s CDT %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

如果失敗會返回NULL嗎?如果是這樣,你可以合併這兩個表達式...... –

+0

@Ic - 是的,它將爲時間戳字段返回NULL。合併? – hacket

回答

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嘗試更改表中的數據並查看它的工作。

+0

我已修改我的帖子以包含我的主要查詢 - 它旨在刪除基於用戶ID和時間戳字段的除最近添加的行之外的所有行。現在說 - #1242 - 子查詢返回多於一行...不知道這意味着什麼... – hacket

+0

@hacket你忘了'MAX',所以它返回所有行! (=子查詢返回多行)嘗試自行運行子查詢,您將看到它將返回表中的所有行。 –

+0

@Ic-優秀:)這看起來很完美謝謝你! – hacket