有一个SQL表,显示餐厅的开始时间和结束时间。一些餐馆中午前开门,晚上关门。但其他餐厅晚上开门,凌晨关门。我想知道哪些餐馆在某个时间开门。
在24小时制的情况下,以下代码给出了令人满意的答案。但是,如果是12小时制的AM/PM,该怎么办?
SELECT * FROM user_time WHERE
(CASE
WHEN user_time.start_time > user_time.end_time THEN 'currenttime' BETWEEN user_time.start_time AND user_time.end_time+24
ELSE 'currenttime' BETWEEN user_time.start_time AND user_time.end_time
END);
如果下表和当前时间=02:40 PM…
1 03:00 PM 01:30 AM
2 03:30 PM 02:00 AM
3 02:30 PM 02:00 AM
4 10:00 AM 09:00 PM
5 08:30 AM 09:30 PM
6 05:00 PM 11:00 PM
结果应该是3,4,5
您可以使用布尔逻辑:
SELECT *
FROM user_time ut
WHERE ( -- start time is before end time so "between"
ut.start_time < ut.end_time and
current_time >= ur.start_time and
current_time <= ut.end_time
) or
( -- start time is after end time so "not between"
ut.start_time > ut.end_time and
(current_time >= ut.start_time or
current_time <= ur.end_time
)
);
逻辑是当开始时间小于结束时间时使用between
,而当开始时间大于结束时间时则使用not between
。但是,逻辑不使用between
,因此开始和结束时间都是这两个范围的一部分。