2017-06-23 48 views
0
SELECT * FROM table WHERE '2016-03-31' > (SELECT MAX(year) from table where bill_id = 'somevalue') 

我使用上面的查詢,檢查2016年3月31日比出現在對bill_id表中的所有歲以上在MySQL中比較日期。它工作正常。但它是比較日期的正確方法。日期將始終以上述格式。有沒有需要轉換日期格式作比較。值2016年3月31日會動態變化,但它會始終YMD格式是格式化需要

注:今年是包含了像2016年5月20日

+0

據我所知,今年和今年的比較會更好,更快。這樣,MySQL在對輸入進行比較之前不需要對輸入做任何事情,只需將它與'MAX(年)' – FMashiro

+0

年份列的輸出進行比較就可以得到Ymd格式的全部值 – hrishi

+1

我不確定是否問您是否必須轉換日期字符串進行比較(你不應該)或如果日期文字是可配置的(不是)。但是在這裏你不是在做日期數學,因爲MySQL只是一些字符串。 –

回答

0

你是不是在比較YMD格式的全日期列名日期。您正在比較字符串'2016-03-31'與數字,例如2015

爲了比較,MySQL默默地將字符串轉換爲數字。人們會認爲這會崩潰,因爲'2016-03-31'當然不是一個數字。然而,MySQL從左向右讀取所有可以被認爲是數字的數據,即'2016'。那麼,有人可能會爭辯說,有些人在數字的末尾加上了一個減號,所以這應該是'2016-',即-2016。無論如何,MySQL在減號之前停止,得到2016並將其用於比較。

我不知道這一切是否能保證在未來有效。我不會依賴這個。

你會期望什麼結果呢? 2016年3月31日比2016年多嗎?這是一個奇怪的問題,你不覺得嗎?

+0

列年包含Y-m-d格式的完整日期,如2016-03-31。所以你可以說2016-03-31與數據庫中的日期相似2015-05-30,2014-03-31 – hrishi

+0

好的,所以我誤解了你的問題。你從我的解釋中看到,選擇了一個非常糟糕的列名,這使得你的查詢幾乎不可讀。所以'year'不包含一年,而是一個日期字符串。由於該字符串始終包含yyyy-mm-dd,並且您將它與具有相同格式的字符串進行比較,所以可以毫無問題地完成此操作。除了命名日期字符串'year'外,使用字符串類型而不是日期類型也很奇怪。這使得錯誤地存儲'2015-055-30'等成爲可能。但是,只要'year'確實包含有效的yyyy-mm-dd日期,那麼您的查詢就沒有問題。 –

+0

好的。我會照顧列名和數據類型 – hrishi

0

試試這個。但是,你真的有一個只存儲一年的專欄year嗎?

SELECT * FROM table WHERE year(STR_TO_DATE('2016-03-31')) 
> (SELECT MAX(year) from table where bill_id = 'somevalue') 
+0

列年包含Y-m-d格式的完整日期,如2016-03-31 – hrishi

0
SELECT * FROM table WHERE YEAR('2016-03-31') > (SELECT MAX(year) from table where bill_id = 'somevalue') 

MySQL的YEAR()返回年份爲給定的日期或時間戳。 「零」日期的返回值範圍爲1000到9999或0。