Выберите смещение на основе текущего времени между временем начала и окончания - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу выбрать смену, используя Текущее время Между StartTime до EndTime

ShiftID     OrgID   ShiftName   StartTime                   EndTime
13          1-1     General     1900-01-01 09:00:00.000     1900-01-01 17:00:00.000
14          1-2     Morning     1900-01-01 08:00:00.000     1900-01-01 15:00:00.000
15          1-3     Evening     1900-01-01 15:00:00.000     1900-01-01 21:00:00.000
16          1-4     Night       1900-01-01 21:00:00.000     1900-01-01 08:00:00.000

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Простого предложения BETWEEN недостаточно для обработки полуночного дела. Вы могли бы сделать что-то вроде этого:

SELECT *
FROM shifts
CROSS APPLY (
    SELECT CONVERT(DATETIME, CONVERT(VARCHAR(8), GETDATE(), 108)) AS CurrTime
) AS ca
WHERE
    (EndTime > StartTime AND CurrTime >= StartTime AND CurrTime < EndTime) OR
    (EndTime < StartTime AND (CurrTime < EndTime OR CurrTime >= StartTime));

Обновленная скрипта SQL

0 голосов
/ 07 сентября 2018

при условии, что StartTime и EndTime имеют тип данных datetime

declare @now datetime

-- this will convert current date time to 1900-01-01 + time
select @now = convert(datetime, convert(time, getdate()))

select  *
from    @shift s
where   @now >= StartTime
and     @now <  case when StartTime < EndTime 
                     then EndTime 
                     else dateadd(day, 1, EndTime) 
                     end
0 голосов
/ 07 сентября 2018

Из вашего вопроса вы можете попытаться использовать 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 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...