运算符与日期之间的mysql

时间:2011-11-10 07:36:22

标签: mysql date between

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')正在重新调整日期。

为什么?

由于 VENU

4 个答案:

答案 0 :(得分:3)

你需要把它投射到日期,如:

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

来自网站:

  

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

答案 1 :(得分:2)

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

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

答案 2 :(得分: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),因为日期是真实的(闰年)

答案 3 :(得分: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没有检查。