基于时间值提取记录

Extract record based on time value

提问人:bircastri 提问时间:9/11/2023 最后编辑:lemonbircastri 更新时间:9/11/2023 访问量:54

问:

我正在使用 SQLServer 2016,并且我有包含以下数据的表 (TIMETABLE):

编号 Descrizione 奥拉伊尼齐奥 奥拉精细
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 在夜间范围内。

如何更改查询以解决此问题?

sql-server 日期时间 sql-server-2016

评论


答:

2赞 Charlieface 9/11/2023 #1

您需要考虑时间颠倒的情况。ORAINIZIO >= ORAFINE

您也不应该用于比较,如此处所述。请改用 .BETWEEN>= AND <

DECLARE @DATA AS DATETIME = '2023-09-11 00:30:00';
DECLARE @tim time(2) = CONVERT(time(2), @DATA);

SELECT * 
FROM TIMETABLE
WHERE (ORAINIZIO < ORAFINE  AND @tim >= ORAINIZIO AND @tim < ORAFINE)
   OR (ORAINIZIO >= ORAFINE AND (@tim < ORAFINE OR @tim >= ORAINIZIO);
3赞 Thom A 9/11/2023 #2

第一个问题是,你看到的是一个周期性值。你看到的是大于,但也大于。A 表示一天中的某个时间,因此最大值为 。time13:00:0006:00:0006:00:0019:00:00time23:59:59.9999999

您需要在此处使用一些逻辑来检查结束时间是否大于开始时间。如果它不大,则需要检查参数是大于开始时间还是小于结束时间:OR

DECLARE @DATA AS time(0) = '2023-09-11T00:30:00' --The date will be truncated

SELECT *
FROM (VALUES(1,'Morning  ',CONVERT(time(0),'06:00:00'),CONVERT(time(0),'13:00:00')), --Use full boundaries and >=/> and </< logic
            (2,'Afternoon',CONVERT(time(0),'13:00:00'),CONVERT(time(0),'19:00:00')),
            (3,'Night    ',CONVERT(time(0),'19:00:00'),CONVERT(time(0),'06:00:00')))V(ID,Descrizione,OraInizio,OraFine)
WHERE (OraInizio < OraFine AND OraInizio < @Data AND OraFine >= @DATA)
   OR (OraInizio > OraFine AND (OraInizio > @DATA OR OraFine <= @DATA));