如何检查CURTIME()是否在两个不同时间之间?

5
我正在尝试使用MySQL进行时间检查,以查看当前时间是否在两个给定的时间戳之间。
我想要做的是,如果设置的通知范围在两个给定的时间戳之间,则生成一个通知列表。
因此,如果有人说在“18:00:01”和“07:59:59”之间通过TXT消息通知我,那么请在“18:00:01”和“07:59:59”之间通过电子邮件通知我。
以下是我的实现方法(假设当前时间为17:00:00)。
SELECT CURTIME() BETWEEN '08:00:00' AND '18:00:00' //this retured 1 which is correct

然而,如果我尝试以下操作(假设当前时间为19:00:00):
SELECT CURTIME() BETWEEN '18:00:01' AND '07:59:59'  //this return 0

这是我的当前查询

 SELECT DISTINCT
TRIM(su.first_name) AS name,
CASE WHEN n.notification_method = "SMS" THEN 
CASE WHEN cc.gateway IS NOT NULL THEN CONCAT(su.phone_cell, cc.gateway) ELSE "" END
ELSE su.email1 END AS address
FROM  ticketing_system_notifications AS n
INNER JOIN(
SELECT DISTINCT created_by, issue_id FROM ticketing_system_discussions
WHERE status = 1
) AS ds ON n.notify = ds.created_by
INNER JOIN users AS su ON su.user_id = n.notify
LEFT JOIN cell_phone_carriers AS cc ON cc.carrier_id = su.carrier_id
WHERE ds.issue_id = 31 AND n.notify <> 12 AND n.notification_type = "REPLY"
AND n.category_id = 0 AND n.status = 1 AND (n.expired_on IS NULL OR n.expired_on > NOW() ) 

AND (  (n.start IS NULL OR n.end IS NULL) OR (  

CASE WHEN n.start <= n.end THEN
CURTIME() BETWEEN n.start AND n.end
ELSE
CURTIME() >= n.start AND CURTIME() <= n.end
END   )  ) 

这就是我做错的地方

CASE WHEN n.start <= n.end THEN
CURTIME() BETWEEN n.start AND n.end
ELSE
CURTIME() >= n.start AND CURTIME() <= n.end
END   )

有人能帮我构建正确捕获时间的逻辑吗?字段 startend 都是 TIME 类型。

在我的 ticketing_system_notifications 表中,我有以下 2 条记录:
1)start = '08:00:00',end = '18:00:00',TEXT
2)start = '17:59:59',end = '07:59:59'


1
如果你需要在午夜时进行操作,那么你也需要处理日期。 - John Conde
1
请在比较中使用完整日期。 - Marcelo Pascual
2个回答

10

如果时间跨越午夜,您应该使用以下逻辑:

 curtime() >= n.start OR curtime() <= n.end

想一想:当前时间必须在“开始时间”和午夜之间,或者在午夜和“结束时间”之间。


我相信你是正确的。当我改变那个时,我得到了我想要的值。非常感谢 :) - Mike
+1:在浏览了很多论坛后,这个终于对我有用了。 - Parvez
对于当前时间为“00:00:01”,开始时间和结束时间分别为“03:00:00”和“04:00:00”,则返回true,这是错误的。 - sushil
这个(旧的?并且被接受的)答案中有一个拼写错误。代码应该是:curtime() >= n.start AND curtime() <= n.end(所以,是AND,而不是OR)。 - undefined
Luuk & Sushil: 这个问题涉及到时间范围跨越午夜并且“结束”时间早于“开始”时间的情况。例如,开始时间为22:00,结束时间为08:00。 - undefined

0
这个很好用。
SELECT * FROM test1 WHERE '00:00:01' BETWEEN startt AND endt

最好是对被接受的答案进行评论,并说明为什么那个答案是错误的,而不是在没有评论的情况下刷屏另一个答案。 - undefined
好的,我会做的,谢谢 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接