繁体   English   中英

MySQL返回假与正确之间的时间

[英]MySQL time between returning false and it should be true

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

没有返回任何内容,而3:00在23:00和5:00之间。 为什么有人可以解释我如何解决这个问题?

目前还不清楚是什么你实际上是试图在这里做,因为即使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

函数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 AND 5之间,它将返回false。 但是是的,3AM实际上是在11PM和5AM之间,那么您如何解决这个问题?

让我们将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)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM