我尝试搜索这个问题,但找不到任何与 mySQL 相关的内容。
我有一个包含各种数据的表,但对于这个问题,相关数据是星期几、开始时间和结束时间。
我正在尝试获取与一周中某一天匹配的记录,其中 now() 在匹配时间范围内。然而,问题是开始时间可以大于结束时间,反之亦然,或者时间也可能只是 00:00:00。
表的相关字段和示例数据page_data
:
field_value | start_time | end_time
------------+------------+---------
Monday | 17:00:00 | 08:00:00
Tuesday | 17:00:00 | 08:00:00
Wednesday | 17:00:00 | 08:00:00
Thursday | 17:00:00 | 08:00:00
Friday | 17:00:00 | 08:00:00
Saturday | 00:00:00 | 00:00:00
Sunday | 00:00:00 | 00:00:00
一些注意事项:
- 00:00:00 - 00:00:00 基本上意味着全天跑步
- 如果开始时间大于结束时间,例如 17:00 - 8:00,则意味着从下午 5 点运行到第二天早上 8 点。
我尝试过now() between start_time and end_time
,但这不包括 start_time > end_time。
以下是我到目前为止所拥有的,但它在不应该返回时返回。
10:00:00 是一个测试时间,不应该返回任何内容,但它确实返回了。
为了测试我对时间进行硬编码而不是使用now()
如果我删除or ('10:00:00' between end_time and start_time)
那么 start_time 更大将不会返回任何内容。
select * from page_data
where field_value = 'Friday'
and (
(start_time = '00:00:00' and end_time = '00:00:00') or
('10:00:00' between start_time and end_time) or
('10:00:00' between end_time and start_time)
)
我对可以用来考虑这些考虑因素的查询感到困惑:
- 开始时间 > 结束时间
- 结束时间 > 开始时间
- 结束时间 && 开始时间 = 00:00:00
谢谢
在 start_time > end_time 的情况下,我猜您只想匹配 test_time 大于 start_time 或小于 end_time 的情况。这在逻辑上相当于 test_time NOT 在 end_time 和 start_time 之间。
如果这个逻辑是正确的,那么这段代码可能就是您所需要的:
你会更喜欢这个吗?
在我看来,使用指定为仅限于一天的时间间隔的“通知窗口”周期会更容易,将跨度超过一天的窗口表示为两个相邻窗口。
然后您只需对照窗口检查当前日期和当前时间即可。
您可以在不更改现有应用程序逻辑或现有表结构的情况下执行此操作: