2010-10-21 55 views
51

例如,下面的查詢工作正常:MySQL的日期時間比較

SELECT * 
    FROM quotes 
WHERE expires_at <= '2010-10-15 10:00:00'; 

但是,這顯然是執行「字符串」比較 - 我想知道是否有內置於MySQL的一個函數,專門做「日期時間」比較。

回答

104

...這顯然是執行「串」比較

沒有 - 如果日期/時間格式所支持的格式相匹配,MySQL的執行隱式轉換的值轉換爲DATETIME ,根據它正在比較的列。同樣的事情發生的:

WHERE int_column = '1' 

...其中的「1」的字符串值轉換爲整數,因爲int_column的數據類型爲int,沒有CHAR/VARCHAR/TEXT。

如果你想將字符串顯式轉換爲DATETIME,該STR_TO_DATE function將是最好的選擇:

WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s') 
+7

如果您的服務器或字符串不在UTC時要小心,因爲隱式轉換髮生在服務器/會話time_zone中,而不是與其進行比較的值的時區。所以即使將它與UTC_TIMESTAMP()進行比較,該字符串也是相同的本地time_zone。 – ClearCrescendo 2012-12-28 17:23:20

+0

@ClearCrescendo:好點,thx。 – 2013-01-01 21:59:44

18

但是,這顯然是執行「串」比較

號的字符串將被自動轉換成DATETIME值。

參見11.2. Type Conversion in Expression Evaluation.

當操作者與不同類型的操作數使用,類型轉換髮生,使操作數兼容。一些轉換隱式發生。例如,MySQL會根據需要自動將數字轉換爲字符串,反之亦然。

0

我知道它很老,但我只是遇到這個問題,有我在看到SQL doc:

[爲了在使用BETWEEN與日期或時間值時獲得最佳結果,]使用CAST()將值顯式轉換爲所需的數據類型。示例:如果將DATETIME與兩個DATE值進行比較,請將DATE值轉換爲DATETIME值。如果在比較DATE時使用字符串常量(如「2001-1-1」),則將該字符串強制轉換爲DATE。

我想這是最好使用STR_TO_DATE,因爲他們花了時間做只是一個功能,並且還,我發現這個在文檔之間的事實...