Mysql日期功能不工作少于

Posted

技术标签:

【中文标题】Mysql日期功能不工作少于【英文标题】:Mysql date function not working for less than 【发布时间】:2012-12-12 15:06:39 【问题描述】:

我需要获取所有等于和小于 2012-12-28 的记录,我为此使用了波纹管查询, booking_time 是 DATETIME 字段,并且有少于 2012-12-28 的记录但它返回零行。 有人知道吗?

SELECT * FROM ctx_bookings WHERE DATE(booking_time)<=2012-12-28 ORDER BY id ASC

表格归档

+---------------------+
| booking_time        |
+---------------------+
| 2012-12-20 03:10:09 |
| 2012-12-25 02:10:04 |
+---------------------+

请问有人知道为什么会这样吗?

【问题讨论】:

2012-12-28 是一个算术表达式,等于 1972。 【参考方案1】:

用单引号包裹值,它肯定会起作用

SELECT * 
FROM ctx_bookings 
WHERE DATE(booking_time) <= '2012-12-28' 
ORDER BY id ASC
SQLFiddle Demo

【讨论】:

【参考方案2】:

如Date and Time Literals 中所述:

mysql 可识别以下格式的 DATE 值:

作为'YYYY-MM-DD''YY-MM-DD' 格式的字符串。允许使用“宽松”语法:任何标点字符都可以用作日期部分之间的分隔符。例如,'2012-12-31''2012/12/31''2012^12^31''2012@12@31' 是等价的。

作为'YYYYMMDD''YYMMDD' 格式的不带分隔符的字符串,前提是该字符串作为日期有意义。例如,'20070523''070523' 被解释为'2007-05-23',但'071332' 是非法的(它有无意义的月份和日期部分)并变成'0000-00-00'

作为YYYYMMDDYYMMDD 格式的数字,前提是该数字作为日期有意义。例如,19830905830905 被解释为 '1983-09-05'

作为@Barmar commented,您的文字表达式2012-12-28 被计算为算术(2012 - 12) - 28,等于1,972。

根据@JW.'s answer,您可以引用该表达式以获得有效的日期字面量(上面的第一种形式)。或者:

在引用文字的同时,您可以使用任何其他标点符号(甚至没有字符)作为日期部分之间的分隔符:

WHERE DATE(booking_time) <= '2012_12_28'
WHERE DATE(booking_time) <= '20121228'

您可以删除分隔符并保留您的文字不加引号:

WHERE DATE(booking_time) <= 20121228

还要注意,使用像这样的过滤条件,它在列上使用函数(在本例中为 DATE() 函数),需要全表扫描才能评估该函数 - 因此它不会受益于任何索引。一个更明智的替代方案是在满足您的条件的列值范围(即 times)上更明确地过滤:

WHERE booking_time < '2012-12-28' + INTERVAL 1 DAY

这是等效的,因为任何严格在第二天之前的时间都必然发生在感兴趣的那一天或之前。它是 sargable,因为该列与常量表达式进行比较(+ 操作的结果是确定性的),因此可以遍历 booking_time 上的索引以立即找到所有匹配的记录。

【讨论】:

【参考方案3】:
 SELECT * FROM ctx_bookings WHERE DATE(booking_time)<='2012-12-28' ORDER BY id ASC

试试这个朋友

【讨论】:

以上是关于Mysql日期功能不工作少于的主要内容,如果未能解决你的问题,请参考以下文章

从 MySql 返回少于 60 天的行

MySQL:从日期时间列计算连续工作日数

在mysql datetime上触发java函数

MySQL中RAND()的工作流程?

MySQL 查询结果与 2 个日期之间的工作日

排序日期不按预期工作