2011-11-10 77 views
2
select '2011-02-29' BETWEEN '2011-02-01' AND '2011-03-03'‎ 

這是返回1.我認爲之間不考慮閏年。我想要你對此的看法?mysql之間的運算符與日期

[編輯]
SELECT DATE('2010-04-31')是返回NULL;
select str_to_date('2010-04-31', '%Y-%m-%d')是重新調整日期。

爲什麼?

感謝 VENU

+0

我認爲它的實現選擇? str_to_date只是不檢查... –

+0

是的,我同意你的意見! – Venu

回答

3

您需要將其轉換爲日期,如:

SELECT DATE('2011-02-29') BETWEEN DATE('2011-02-01') AND DATE('2011-03-03') 

從網站:

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

2

問題是你在比較字符串,而不是日期。 如果你嘗試:

select DATE('2011-02-29') you get a NULL... 
1

你比較字符串...你必須投中的值(或至少是第一個)爲DATE

使用此:

SELECT DATE('2011-02-29') BETWEEN '2011-02-01' AND '2011-03-03' 

這會給你NULL,因爲日期不是真實的

SELECT DATE('2008-02-29') BETWEEN '2008-02-01' AND '2008-03-03' 

這會給你1(TRUE),因爲日期是真實的(閏年)

+0

感謝阿齊茲的清晰解釋! – Venu

1

DATE檢查的有效性,同時str_to_date沒有。

mysql> select str_to_date('2010-02-31', '%Y-%m-%d'); 
+---------------------------------------+ 
| str_to_date('2010-02-31', '%Y-%m-%d') | 
+---------------------------------------+ 
| 2010-02-31       | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

mysql> select str_to_date('2010-04-31', '%Y-%m-%d'); 
+---------------------------------------+ 
| str_to_date('2010-04-31', '%Y-%m-%d') | 
+---------------------------------------+ 
| 2010-04-31       | 
+---------------------------------------+ 
1 row in set (0.00 sec) 
mysql> select date('2010-02-31'); 
+--------------------+ 
| date('2010-02-31') | 
+--------------------+ 
| NULL    | 
+--------------------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> select date('2010-04-31'); 
+--------------------+ 
| date('2010-04-31') | 
+--------------------+ 
| NULL    | 
+--------------------+ 
1 row in set, 1 warning (0.00 sec) 

UPDATE根據@Aziz,DATE將檢查日期是否是真的還是假的。根據我的測試,似乎str_to_date不檢查。

+0

SELECT DATE('2010-04-31')返回NULL;但選擇str_to_date('2010-04-31','%Y-%m-%d')正在重新調整日期.. – Venu

+0

是的,我已更新我的帖子。 –

+0

感謝詹姆斯的清晰解釋! – Venu