SELECT *
FROM tablename
WHERE
MAKETIME(3,0,0) BETWEEN MAKETIME(23,0,0) AND MAKETIME(5,0,0)
没有返回,3:00在23:00到5:00之间。为什么有人能解释我如何解决这个问题?
答案 0 :(得分:3)
目前还不清楚你在这里尝试做什么,因为即使3在5到23之间,你的查询也只会返回表格中的每条记录。
SELECT MAKETIME(3,0,0) BETWEEN MAKETIME(5,0,0) AND MAKETIME(23,0,0)
返回0,因为3不在5和23之间。
SELECT MAKETIME(5,0,0) BETWEEN MAKETIME(3,0,0) AND MAKETIME(23,0,0)
返回1,因为5介于3和23之间。
演示:SQL Fiddle
据推测,您正在尝试包装前一天,在这种情况下,您可以直接比较datetime
值,但鉴于您的问题,您实际使用的是哪些字段/数据类型,目前还不清楚。
<强>更新强> 根据您的评论,我认为您需要进行2次比较。 3不是在5和23之间,因为时间不会跨越几天。但如果您只关心时间部分,您可以像这样处理它:
SELECT *
FROM tablename
WHERE YourTime BETWEEN MAKETIME(23,0,0) AND MAKETIME(23,59,59)
OR YourTime BETWEEN MAKETIME(0,0,0) AND MAKETIME(5,0,0)
请记住BETWEEN
是包容性的,所以如果你的截止时间是凌晨5点,你可能希望它是MAKETIME(4,59,59)
,所以它包括4:59而不是5:00
答案 1 :(得分:1)
函数MAKETIME返回根据小时,分钟和秒参数计算的时间值:
mysql> SELECT MAKETIME(3,0,0),MAKETIME(23,0,0),MAKETIME(5,0,0)
-> '03:00:00', '23:00:00', '05:00:00'
当然,3不是在23和5之间,它将返回false。但是,是的,凌晨3点实际上是在晚上11点到凌晨5点之间,你怎么能解决这个问题?
我们将23视为您的START_TIME,将5视为您的END_TIME。
由于START_TIME必须在END_TIME之前发生,如果不是这种情况(23> 5),则意味着该间隔在第二天滚动。
我会尝试这样的查询:
SELECT *
FROM yourtable
WHERE
(MAKETIME(START_TIME,0,0)<=MAKETIME(END_TIME,0,0) AND MAKETIME(3,0,0) BETWEEN MAKETIME(START_TIME,0,0) AND MAKETIME(END_TIME,0,0))
OR
(MAKETIME(START_TIME,0,0)>MAKETIME(END_TIME,0,0) AND NOT (MAKETIME(3,0,0) BETWEEN MAKETIME(START_TIME,0,0) AND MAKETIME(END_TIME,0,0)))