select '2011-02-29' BETWEEN '2011-02-01' AND '2011-03-03'
これは 1 を返しています。間はうるう年を考慮していないと思います。これについてあなたの意見が欲しいですか?
[編集]
SELECT DATE( '2010-04-31' )
は NULL を返します。
しかしselect str_to_date('2010-04-31', '%Y-%m-%d')
、帰国日です。
なんで?
ありがとう
次のように日付にキャストする必要があります。
SELECT DATE('2011-02-29') BETWEEN DATE('2011-02-01') AND DATE('2011-03-03')
サイトから:
日付または時刻の値で BETWEEN を使用する場合に最良の結果を得るには、CAST() を使用して値を目的のデータ型に明示的に変換します。例: DATETIME を 2 つの DATE 値と比較する場合、DATE 値を DATETIME 値に変換します。DATE との比較で '2001-1-1' などの文字列定数を使用する場合は、文字列を DATE にキャストします。
問題は、日付ではなく文字列を比較していることです。試してみると:
select DATE('2011-02-29') you get a NULL...
文字列を比較しています...値(または少なくとも最初の値)を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) が返されます。
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)
@Aziz によるUPDATEDATE
は、日付が本物かどうかをチェックします。私のテストによると、str_to_date
チェックしていないようです。