我需要获得所有相同且低于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 |
+---------------------+
请有人知道为什么会这样吗?
答案 0 :(得分:40)
用单引号包装值,肯定会起作用
SELECT *
FROM ctx_bookings
WHERE DATE(booking_time) <= '2012-12-28'
ORDER BY id ASC
答案 1 :(得分: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'
。作为
YYYYMMDD
或YYMMDD
格式的数字,前提是该数字作为日期有意义。例如,19830905
和830905
被解释为'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()
函数),需要进行全表扫描才能评估该函数 - 因此不会从任何索引中受益。更可靠的替代方法是在符合条件的列值范围(即次)上更明确地过滤:
WHERE booking_time < '2012-12-28' + INTERVAL 1 DAY
这是等效的,因为任何严格在第二天之前发生的时间必然发生在感兴趣的日子或之前。它是可以攻击的,因为将列与常量表达式进行比较(+
操作的结果是确定性的),因此可以遍历booking_time
上的索引以立即找到所有匹配的记录。
答案 2 :(得分:2)
SELECT * FROM ctx_bookings WHERE DATE(booking_time)<='2012-12-28' ORDER BY id ASC
尝试这个伴侣