2016-01-16 54 views
2

該SQL返回MySQL 5.5中的DATE,但返回MySQL 5.6中的NULL。爲什麼?STR_TO_DATE MySQL 5.5和MySQL 5.6之間的差異

select date(STR_TO_DATE('2015-01', '%Y-%m')) + INTERVAL 1 DAY; 

這裏有一個SQL小提琴爲MySQL 5.55.6STR_TO_DATE在兩種情況下均返回日期。使用DATE轉換結果的作品。試圖添加INTERVAL時出現問題。不要緊,如果我將INTERVAL添加到STR_TO_DATE(...)DATE(STR_TO_DATE(...)),結果是一樣的。但是,刪除STR_TO_DATE會使其正常工作。

select 
    STR_TO_DATE('2015-01', '%Y-%m') as same_a1, 
    STR_TO_DATE('2015-01-01', '%Y-%m') as same_a2, 
    STR_TO_DATE('2015-01', '%Y-%m-%d') as same_a3, 
    STR_TO_DATE('2015-01-01', '%Y-%m-%d') as same_a4, 
    date(STR_TO_DATE('2015-01', '%Y-%m')) as same_b1, 
    date(STR_TO_DATE('2015-01-01', '%Y-%m')) as same_b2, 
    date(STR_TO_DATE('2015-01', '%Y-%m-%d')) as same_b3, 
    date(STR_TO_DATE('2015-01-01', '%Y-%m-%d')) as same_b4, 
    STR_TO_DATE('2015-01', '%Y-%m') + INTERVAL 1 DAY as same_c1, 
    STR_TO_DATE('2015-01-01', '%Y-%m') + INTERVAL 1 DAY as same_c2, 
    STR_TO_DATE('2015-01', '%Y-%m-%d') + INTERVAL 1 DAY as same_c3, 
    STR_TO_DATE('2015-01-01', '%Y-%m-%d') + INTERVAL 1 DAY as same_c4, 
    date(STR_TO_DATE('2015-01', '%Y-%m')) + INTERVAL 1 DAY as different_d1, 
    date(STR_TO_DATE('2015-01-01', '%Y-%m')) + INTERVAL 1 DAY as different_d2, 
    date(STR_TO_DATE('2015-01', '%Y-%m-%d')) + INTERVAL 1 DAY as different_d3, 
    date(STR_TO_DATE('2015-01-01', '%Y-%m-%d')) + INTERVAL 1 DAY as same_d4, 
    date('2015-01') + INTERVAL 1 DAY as same_e1, 
    date('2015-01-01') + INTERVAL 1 DAY as same_e2 
; 

我搜索了發行說明,但找不到任何東西。到底是怎麼回事?這是一個已知的變化嗎?一個錯誤?

+0

對於它的價值,我看到5.1.73和MariaDB 10.0.21之間的差異。 –

+0

使用MySQL CLI客戶端而不是SQLFiddle,我發現'STR_TO_DATE()'在沒有給定日期值時會產生一個奇怪的結果:'SELECT STR_TO_DATE('2015-03')'產生'2015-03-00'。我無法添加日期。它在舊版本和新版本中產生「第00天」的事實似乎是錯誤的,但是在給定奇怪行爲的情況下,如果不在更高版本中接收NULL,則無法向該無效日期添加時間間隔似乎是正確的。舊版本允許我將「day 00」添加1天爲「SELECT DATE(STR_TO_DATE('2015-03','%Y-%m'))+ INTERVAL 1 DAY;'導致'2015-03- 01' –

+0

^^ ...這不是我期望的結果。我期望它從「2015-03-01」開始,並在「2015-03-02」中添加1天。 –

回答

2

這是一個衆所周知的變化,這是不知不覺引入版本5.1.595.5.165.6.3(但然後在5.1.625.5.21版本回滾;它被保留在5.6行):

不相容更改:修改了與日期有關的斷言的處理。

但是,這種變化的結果是,當傳遞一個DATE()函數值作爲它們的參數時,幾個函數變得更加嚴格,並且拒絕不完整的日期,其中一天的部分爲零。這些功能受到影響:CONVERT_TZ()DATE_ADD()DATE_SUB()DAYOFYEAR()LAST_DAY()TIMESTAMPDIFF()TO_DAYS()TO_SECONDS()WEEK()WEEKDAY()WEEKOFYEAR()YEARWEEK()。因爲這改變了通用可用性狀態系列(MySQL 5.1和5.5)中的日期處理行爲,所以它在5.1.62和5.5.21中被恢復。這個改變被保留在MySQL 5.6中。

參考文獻:參見Bug#13458237。

您受到影響是因爲+ INTERVAL表示法只是圍繞DATE_ADD()函數的語法糖。

+0

順便提一句,該變更僅在5.6行中爲'LAST_DAY()'返回,在[5.6.5](https:// dev .mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html)。 – eggyal

+0

+1謝謝@eggyal!這正是我想要的,現在我可以證明問題不是由我的代碼造成的。 –