2011-03-21 54 views
2

我不得不做一些日期比較並返回一個數據集。 PHP發送當前日期時間,時間爲非前導零(8:00:00),時間爲早上8點而不是(08:00:00)。沒有前導零的情況是錯誤的結果。有人能解釋爲什麼嗎?沒有前導零的Mysql日期比較(大於等於)

要進行測試,運行此SELECT IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= '2011-03-20 8:00:00',"yes","No")

結果:沒有

SELECT IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= '2011-03-20 08:00:00',"yes","No")

結果:是

不應同時給出結果: 「是」

是d oing字符串比較的一個非領先的零?

+2

您已編輯原始問題以刪除對'DATE_ADD'的引用,這是實際上問題的根源,因此使問題稍有不同。 – 2011-03-21 15:38:40

+0

爲道歉造成的困惑..我爲了簡單起見,如果你運行上面的例子,它也會失敗。 – Stewie 2011-03-21 17:26:16

+0

上面的例子因爲一個不同的原因失敗:你永遠不會對日期進行任何引用。 MySQL沒有辦法知道它們不應該是常規字符串。 – 2011-03-21 17:34:58

回答

3

我認爲這是爲了處理MySQL中相當狡猾的日期/時間處理在MySQL中轉換爲數字,而在其他情況下,它使用字符串比較。

從手動

http://dev.mysql.com/doc/refman/5.0/en/using-date.html

當日期,時間,DATETIME或TIMESTAMP比較恆定的串與<,< =,=,> =,>,或BETWEEN運營商, MySQL通常會將字符串轉換爲一個內部長整數,以便進行更快的比較(還有一點「輕鬆」的字符串檢查)。然而,這種轉換是受以下情況除外:

當你比較兩列

當你比較DATE,TIME,DATETIME或TIMESTAMP列與表達式

當您使用任何其他的比較方法比剛剛列出的方法,如IN或STRCMP()。

對於這些特殊情況,通過將對象轉換爲字符串並執行字符串比較來完成比較。

+0

啊哈!正確的錢 – Stewie 2011-03-21 15:27:39

3

嚴格地說,你是比較字符串(不是日期),並依靠自動鑄造。試試這個:

SELECT 
IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= STR_TO_DATE('2011-03-20 8:00:00', '%Y-%m-%d %H:%i:%s'), 'Yes', 'No'), 
IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= STR_TO_DATE('2011-03-20 08:00:00', '%Y-%m-%d %H:%i:%s'), 'Yes', 'No') 

更新:

According to the manualDATE_ADD()可以返回一個日期的字符串:

返回值取決於 參數:

DATETIME if the first argument is a DATETIME (or TIMESTAMP) value, 
or if the first argument is a DATE and the unit value uses HOURS, 
MINUTES, or SECONDS. 

String otherwise. 

要確保結果是DATETIME,您可以使用CAST()將 第一個參數轉換爲DATETIME。

因此,>=比較的左操作數是一個字符串,因此您將獲得字符串比較。嘗試使用CAST('2011-03-21' AS DATE)建議。

+0

嗯..正確,但我認爲MySQL做了一個內部字符串時間轉換datetime比較。還有一個問題,如果它是「date_time_field」> ='2011-03-20 8:00:00' – Stewie 2011-03-21 15:25:12

+0

謝謝,你的答案幫助.. upvoted – Stewie 2011-03-21 15:31:59

+0

事實上,我會說問題在於' ADD_DATE'。我會更新我的答案。 – 2011-03-21 15:33:28