2015-04-02 22 views
0

在MySQL中使用CURRENT_DATE函數時,我遇到了奇怪的意外行爲。考慮以下內容:使用CURRENT_DATE減數值時MySQL奇怪的行爲

SELECT 
    DATE(CURRENT_DATE - 0) AS 'today', 
    DATE(CURRENT_DATE - 1) AS 'yesterday', 
    DATE(CURRENT_DATE - 2) AS '2 days ago', 
    DATE(CURRENT_DATE - 3) AS '3 days ago' 

奇怪的是,這會返回兩個日期和兩個NULL值(在2015-04-01上執行時)。下面的代碼返回四個日期,符合市場預期:

SELECT 
    DATE_ADD(CURRENT_DATE, INTERVAL 0 DAY) AS 'today', 
    DATE_ADD(CURRENT_DATE, INTERVAL -1 DAY) AS 'yesterday', 
    DATE_ADD(CURRENT_DATE, INTERVAL -2 DAY) AS '2 days ago', 
    DATE_ADD(CURRENT_DATE, INTERVAL -3 DAY) AS '3 days ago' 

任何人都知道爲什麼前集的代碼返回意外的結果,後者的回報預期的結果?

+0

那麼,爲什麼你認爲你可以從日期減少整數? – zerkms 2015-04-02 01:57:08

回答

1

date和datetime「常量」的值不是日期和時間。他們是字符串或數字,如文檔幾乎清楚地解釋:

返回當前日期爲「YYYY-MM-DD」的值或YYYYMMDD 格式,取決於函數是否用在字符串中使用或 數字上下文。

-創建數字上下文。所以,

DATE(CURRENT_DATE - 0) --> DATE(20150401 - 1) = DATE(20150401) 

得到正確轉換。但考慮:

DATE(CURRENT_DATE - 2) --> DATE(20150401 - 2) = DATE(20150399) 

這不是一個有效的日期。所以它不會被轉換。而且,MySQL確實將20150400識別爲日期,這就是爲什麼這個轉換沒有錯誤。

當使用MySQL時,我的建議是對所有日期操作使用date_add()date_sub(),除非日期列明顯類型爲日期數據類型。

+0

謝謝,這是清楚和有益的。我會爲答案投票,但我只是開始我的帳戶......唉,我不能。 – mkprkr 2015-04-02 03:30:11

1

因爲CURRENT_DATE是日期,而不是整數。考慮第一個查詢。你的意思是-1? -1秒?分鐘?小時?天?月?年? MySQL應該如何猜測?因此INTERVAL語句的存在

+0

感謝您的快速回復。一般來說,當您從CURRENT_DATE減1時,確實會減去一天。由於這是默認行爲,並且我已經多次看到這一點,所以我開始期待它。您提出的基本原理解釋了爲什麼DATE_ADD方法通常更可取(因爲我被迫將INTERVAL指定爲DAY),但它並不能解釋爲什麼在某些情況下CURRENT_DATE - 1返回NULL。 @ Gordon-Linoff在下面的解釋澄清了這一點。 – mkprkr 2015-04-02 03:39:09