我使用的是 SQLServer 2016,表 (TIMETABLE) 包含以下数据:
ID | 描述 | 奥拉伊尼齐奥 | 奥拉芬 |
---|---|---|---|
1 | 早晨 | 06:00:00 | 13:00:00 |
2 | 下午 | 13:00:01 | 19:00:00 |
3 | 夜晚 | 19:00:01 | 05:59:59 |
现在我需要使用日期时间从该表中提取 ID,因此我编写了以下查询:
DECLARE @DATA AS DATETIME = '11-09-2023 00:30:00'
SELECT *
FROM TIMETABLE
WHERE Convert(time(2), Convert(smalldatetime, @DATA)) BETWEEN ORAINIZIO AND ORAFINE
现在这个查询不起作用:它应该提取 ID = 3,因为时间 00:30 在夜间范围内。
如何更改查询来解决此问题?
您需要考虑
ORAINIZIO >= ORAFINE
时间颠倒的情况。您也不应该用于
BETWEEN
比较,如此处所述。而是使用>= AND <
.第一个问题是您将其视为
time
周期性值。您看到的是大于13:00:00
,但06:00:00
也06:00:00
大于。A代表一天中的某个时间,因此最大值为。19:00:00
time
23:59:59.9999999
您需要
OR
在此处使用一些逻辑来检查结束时间是否大于开始时间。如果不大于,您需要检查参数是否大于开始时间或小于结束时间: