28

我需要获取所有等于和小于 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 |
+---------------------+

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

4

3 回答 3

67

用单引号将值括起来,肯定会起作用

SELECT * 
FROM ctx_bookings 
WHERE DATE(booking_time) <= '2012-12-28' 
ORDER BY id ASC
于 2012-12-27T07:31:12.030 回答
12

日期和时间文字下所述:

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

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

  • 作为在任何一种格式中都没有分隔符的'YYYYMMDD'字符串'YYMMDD',前提是该字符串作为日期有意义。例如,'20070523'and'070523'被解释为'2007-05-23', 但是'071332'是非法的(它有无意义的月份和日期部分)并且变成'0000-00-00'.

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

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

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

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

    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

This is equivalent because any time that falls strictly prior to the following day will necessarily have occurred on or before the day of interest. It is sargable because the column is compared to a constant expression (the result of the + operation being deterministic), and therefore an index over booking_time can be traversed to immediately find all matching records.

于 2012-12-27T07:55:18.313 回答
2
 SELECT * FROM ctx_bookings WHERE DATE(booking_time)<='2012-12-28' ORDER BY id ASC

试试这个伙伴

于 2012-12-27T07:32:19.833 回答