Mysql日期函数不能正常工作

Gih*_*sha 17 mysql sql select date

我需要获得所有相同且低于2012-12-28的记录我使用了下面的查询,booking_time是DATETIME字段,并且记录小于2012-12-28,但它返回零行.有没有人有想法?

SELECT * FROM ctx_bookings WHERE DATE(booking_time)<=2012-12-28 ORDER BY id ASC
Run Code Online (Sandbox Code Playgroud)

表提交

+---------------------+
| booking_time        |
+---------------------+
| 2012-12-20 03:10:09 |
| 2012-12-25 02:10:04 |
+---------------------+
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*Woo 47

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

SELECT * 
FROM ctx_bookings 
WHERE DATE(booking_time) <= '2012-12-28' 
ORDER BY id ASC
Run Code Online (Sandbox Code Playgroud)


egg*_*yal 11

日期和时间文字中所述:

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格式的数字,只要该数字作为日期有意义.例如,19830905并被830905解释为'1983-09-05'.

正如@Barmar评论的那样,您的文字表达式2012-12-28被计算为算术(2012 - 12) - 28,等于1,972.

Per @ JW.的答案,你可以引用该表达式来获得一个有效的日期文字(上面的第一个表格).或者:

另请注意,使用像这样的过滤器标准(在DATE()列上使用函数(在本例中为函数))需要进行全表扫描才能评估该函数 - 因此它不会从任何索引中受益.更可靠的替代方法是在满足条件的列值(即时间)范围内更明确地过滤:

WHERE booking_time < '2012-12-28' + INTERVAL 1 DAY
Run Code Online (Sandbox Code Playgroud)

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