提问人:bircastri 提问时间:9/11/2023 最后编辑:lemonbircastri 更新时间:9/11/2023 访问量:54
基于时间值提取记录
Extract record based on time value
问:
我正在使用 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 在夜间范围内。
如何更改查询以解决此问题?
答:
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 表示一天中的某个时间,因此最大值为 。time
13:00:00
06:00:00
06:00:00
19:00:00
time
23: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));
评论