2
select '2011-02-29' BETWEEN '2011-02-01' AND '2011-03-03'‎

这是返回 1。我认为between不考虑闰年。我想听听你对此的看法?

[编辑]
SELECT DATE( '2010-04-31' )返回 NULL;
select str_to_date('2010-04-31', '%Y-%m-%d')正在重调日期。

为什么?

谢谢金星

4

4 回答 4

3

您需要将其转换为日期,例如:

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

从网站:

为了在将 BETWEEN 与日期或时间值一起使用时获得最佳结果,请使用 CAST() 将值显式转换为所需的数据类型。示例:如果将 DATETIME 与两个 DATE 值进行比较,请将 DATE 值转换为 DATETIME 值。如果在与 DATE 的比较中使用字符串常量(例如 '2001-1-1'),请将字符串转换为 DATE

于 2011-11-10T07:42:44.553 回答
2

问题是您正在比较字符串,而不是日期。如果你试试:

select DATE('2011-02-29') you get a NULL...
于 2011-11-10T07:43:55.087 回答
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) 因为日期是真实的(闰年)

于 2011-11-10T07:44:05.693 回答
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)

根据@Aziz 更新,DATE检查日期是否真实。根据我的测试,似乎str_to_date没有检查。

于 2011-11-10T07:47:01.430 回答