返回false之间的MySQL时间应该是真的

时间:2013-11-27 20:27:52

标签: mysql sql

SELECT *
FROM tablename
WHERE
  MAKETIME(3,0,0) BETWEEN MAKETIME(23,0,0) AND MAKETIME(5,0,0)

没有返回,3:00在23:00到5:00之间。为什么有人能解释我如何解决这个问题?

2 个答案:

答案 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)))