Из вашего вопроса вы можете попытаться использовать CAST(CAST(GETDATE() AS TIME) AS DATETIME)
, чтобы установить дату как 1900-01-01
время, когда мы сравниваем только значение time
.
check Night
необходимо использовать небольшой навык, потому что значение будет пересекать дату.
, когда GETDATE()
время между '00:00:00'
и '08:00:00'
означает перекрестную дату.
поэтому нам нужно добавить одну дату для CAST(CAST(GETDATE() AS TIME) AS DATETIME)
CREATE TABLE T(
ShiftID INT,
OrgID VARCHAR(50),
ShiftName VARCHAR(50),
StartTime DATETIME,
EndTime DATETIME
);
INSERT INTO T VALUES (13,'1-1','General','1900-01-01 09:00:00.000','1900-01-01 17:00:00.000');
INSERT INTO T VALUES (14,'1-2','Morning','1900-01-01 08:00:00.000','1900-01-01 15:00:00.000');
INSERT INTO T VALUES (15,'1-3','Evening','1900-01-01 15:00:00.000','1900-01-01 21:00:00.000');
INSERT INTO T VALUES (16,'1-4','Night','1900-01-01 21:00:00.000','1900-01-01 08:00:00.000');
Запрос 1 :
SELECT t1.*
FROM T t1
WHERE
CASE WHEN CONVERT(datetime,CONVERT(varchar(8),GETDATE(),108)) BETWEEN CONVERT(DATETIME,'00:00:00') AND CONVERT(DATETIME,'00:08:00')
THEN CONVERT(datetime,CONVERT(varchar(8),GETDATE(),108)) + 1
ELSE CONVERT(datetime,CONVERT(varchar(8),GETDATE(),108))
END
BETWEEN StartTime
AND
CASE WHEN ShiftName = 'Night'
THEN EndTime + 1
ELSE EndTime
END
Результаты :
| ShiftID | OrgID | ShiftName | StartTime | EndTime |
|---------|-------|-----------|----------------------|----------------------|
| 13 | 1-1 | General | 1900-01-01T09:00:00Z | 1900-01-01T17:00:00Z |
| 14 | 1-2 | Morning | 1900-01-01T08:00:00Z | 1900-01-01T15:00:00Z |