带有日期的运算符之间的mysql

Posted

技术标签:

【中文标题】带有日期的运算符之间的mysql【英文标题】:mysql between operator with dates 【发布时间】:2011-11-10 07:36:21 【问题描述】:
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') 正在重新调整日期。

为什么?

谢谢 金星

【问题讨论】:

我认为它的实现选择? str_to_date 只是不检查... 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您正在比较字符串...您必须将值(或至少第一个)转换为 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),因为 日期是真实的(闰年)

【讨论】:

【参考方案4】:

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 似乎没有检查。

【讨论】:

SELECT DATE('2010-04-31') 返回 NULL;但是 select str_to_date('2010-04-31', '%Y-%m-%d') 正在重新调整日期..

以上是关于带有日期的运算符之间的mysql的主要内容,如果未能解决你的问题,请参考以下文章

drupal 8 views日期范围过滤器 - '在'运算符之间'不包括结束日期

Informix 日期时间选择标准(在运算符之间)

MySQL学习18:运算符与函数之数值运算符和函数比较运算符和函数日期时 间函数

mysql中日期函数和日期的加减运算

为啥 MySQL 在使用带有通配符的 LIKE 运算符时会忽略假名敏感?

带有 LIKE 运算符的 Select 语句中的 MySQL 案例