Нахождение правильного сдвига на основе времени в хранимой процедуре SQL Server - PullRequest
0 голосов
/ 24 апреля 2019

У меня в таблице 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 @Currentdate AS DATETIME
DECLARE @Currenttime AS TIME
DECLARE @PreviousShifttime AS TIME

SET @Currentdate = GETDATE()
PRINT @currentdate  

SET @Currenttime = (SELECT CAST(@Currentdate AS TIME))
PRINT @Currenttime  

SET @PreviousShifttime = (SELECT DATEADD(HOUR, -8, @Currentdate))
PRINT @PreviousShifttime  

SELECT 
    ShiftNo, ShiftName, ShiftStart, ShiftEnd, IsNextDay, IsBothNextDay 
FROM
    ShiftInfo
WHERE
    @PreviousShifttime BETWEEN ShiftStart AND ShiftEnd

Эта процедура не возвращает ожидаемый результат, когда я хочу получить строку shift 3. Выход для этого случая:пусто

Может кто-нибудь сказать мне, где я иду не так?

1 Ответ

0 голосов
/ 24 апреля 2019

конвертировать в datetime для сравнения. для смены 3 время окончания смены становится следующим днем ​​

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 @Currenttime = '06:30'

--  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, @Currenttime) between shift_start and shift_end
or       dateadd(day, 1, convert(datetime, @Currenttime)) between shift_start and shift_end

РЕДАКТИРОВАТЬ: чтобы получить предыдущий сдвиг на основе @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
),
current_shift as
(
    select  PrevShiftTime = dateadd(minute, -1, shiftstart)
    from    shifts
    where   convert(datetime, @Currenttime) between shift_start and shift_end
    or       dateadd(day, 1, convert(datetime, @Currenttime)) between shift_start and shift_end
)
select  *
from    shifts s
    cross join current_shift c
    where   convert(datetime, PrevShiftTime) between shift_start and shift_end
    or       dateadd(day, 1, convert(datetime, PrevShiftTime)) between shift_start and shift_end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...