У меня в таблице 8 часовых смен, как это Shift
и shiftstart
и shiftend
тип данных как time(7)
.
ShiftNo ShiftName ShiftStart ShiftEnd IsNextDay IsBothNextDay
--------------------------------------------------------------------
1 Shift1 7:00:00 14:59:59 0 0
2 SHift2 15:00:00 22:59:59 0 0
3 Shift3 23:00:00 7:00:00 1 0
Если я выполню процедуру в 07:10, ядолжен получить строку shift3
23:00:00.0000000-07:00:00.0000000 as timestamp
Моя существующая процедура
declare @shift table
(
shiftno int,
shiftstart time(7),
shiftend time(7)
)
-- sample data
insert into @shift
values (1, '07:00', '14:59:59'),
(2, '15:00', '22:59:59'),
(3, '23:00', '07:00:00')
DECLARE @Currenttime AS TIME
SET @Currentdate = GETDATE()
SET @Currenttime = (SELECT CAST(@Currentdate AS TIME))
SET @PreviousShifttime = (SELECT DATEADD(HOUR, -8, @Currenttime))
-- the query
; with shifts as
(
select *,
shift_start = convert(datetime, shiftstart),
shift_end = case when shiftstart < shiftend
then convert(datetime, shiftend)
else dateadd(day, 1, convert(datetime, shiftend))
end
from @shift
)
select *
from shifts
where convert(datetime, @PreviousShifttime) between shift_start and shift_end
or dateadd(day, 1, convert(datetime, @PreviousShifttime)) between shift_start and shift_end
Эта процедура возвращает текущий ряд смен правильно.Но я хочу, чтобы предыдущие строки смены без жесткого кодирования -8 часов на основе ближайшего значения начала смены в конце предыдущей смены