SQL получает значения между двумя - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть таблица в SQL Server (2012), она содержит следующее: (пример данных)

<table><tbody><tr><th>itemRef(vchar50)</th><th>itemStatus(vchar50)</th><th>statusStart(datetime)</th><th>statusFinish(datetime)</th></tr><tr><td>itemXYZ</td><td>ORDER RECEIVED</td><td>2018-12-10 20:10:18.000</td><td>2018-12-10 22:10:19.000</td></tr><tr style='background-color: #cecece;'><td>itemXYZ</td><td>PICKING</td><td>2018-12-10 22:10:19.000</td><td>2018-12-11 11:14:32.000</td></tr><tr><td>itemXYZ</td><td>PACKING</td><td>2018-12-11 11:14:32.000</td><td>2018-12-11 12:10:53.000</td></tr><tr><td>itemXYZ</td><td>DISPATCH NOTICE</td><td>2018-12-11 12:10:53.000</td><td>2018-12-11 12:10:57.000</td></tr><tr><td>itemXYZ</td><td>AWAITING DISPATCH</td><td>2018-12-11 12:10:57.000</td><td>2018-12-11 12:27:14.000</td></tr></tbody></table>

Я пытаюсь выполнить запросы к таблице, которая разделяет дни недели на смены:

  • (Day Shift:Пн - четверг с 8:00 до 22:00 и пятница с 8:00 до 15:30)

    ((DATEPART(dw, statusStart) in (2,3,4,5) and CONVERT(TIME, statusStart)>=''08:00:00'' AND CONVERT(TIME, statusStart) < ''22:00:00'') OR 
    (DATEPART(dw, statusStart) in (5) and CONVERT(TIME, statusStart) >=''08:00:00'' AND CONVERT(TIME,statusStart) < ''15:30:00''))';
    
  • (Ночная смена: Пн - Пт с 10:00 до 8:00)

    ((DATEPART(dw, statusStart) in (2,3,4,5) and (CONVERT(TIME, statusStart) >=''22:00:00'' OR CONVERT(TIME, statusStart) < ''08:00:00'')))';
    
  • (Смена выходных: пт - пн. 15:30 - 8:00)

    ((DATEPART(dw, statusStart) in (6,1) OR (DATEPART(dw, statusStart) in (5) and CONVERT(TIME, statusStart) >=''15:30:00'') OR (DATEPART(dw, statusStart) in (2) and CONVERT(TIME, statusStart) <''08:00:00'')))';
    

Вышеприведенная часть является частью хранимой процедуры, которая возвращает данные правильно, за исключением случая, когда начался itemStatusдо начала и окончания смены - т.е. выделенная строка в приведенной выше таблице!

Если я выполню запрос - выберите * из таблицы, где смена - Дневная смена - статус комплектации будет исключен при его началедо начала дневной смены - 8:00

image1 1

Я пытаюсь добиться того, чтобы: если я выполняю запрос - выберите * из таблицы, где сдвиг - деньshift

image2 2

8 утра становится новым временем начала комплектования - я мог бы тогда запросить - что тРазница во времени между statusStart и statusFinish, где сдвиг - Дневная смена, а itemStatus - «Сбор»

Надеюсь, это имеет смысл!

1 Ответ

0 голосов
/ 12 декабря 2018

Нечто подобное может привести вас в нужном направлении ...

SELECT 
    itemRef,
    itemStatus,
    CASE WHEN CONVERT(TIME, statusStart) >  CASE WHEN DATEPART(dw, statusStart)  = 5 THEN '15:30:00' ELSE '22:00:00' END THEN DATEADD(dd, 0, DATEDIFF(dd, 0, statusFinish)) + CAST('08:00:00' AS DATETIME) ELSE statusStart END AS statusStart,
    statusFinish
FROM #test
WHERE 
   (DATEPART(dw, statusStart) in (2,3,4,5) and CONVERT(TIME, statusStart)>='08:00:00' AND CONVERT(TIME, statusStart) < CASE WHEN DATEPART(dw, statusStart)  = 5 THEN '15:30:00' ELSE '22:00:00' END)
   OR (DATEPART(dw, statusFinish) in (2,3,4,5) and CONVERT(TIME, statusFinish)>='08:00:00' AND CONVERT(TIME, statusFinish) < CASE WHEN DATEPART(dw, statusStart)  = 5 THEN '15:30:00' ELSE '22:00:00' END)

Вы можете проверить это здесь: https://rextester.com/TGO17469

Возвращает эти результаты:

enter image description here

ОБНОВЛЕНИЕ Фильтрация "комплектации" на основе комментария требует небольшой корректировки предложения WHERE:

WHERE 
   (
       (DATEPART(dw, statusStart) in (2,3,4,5) and CONVERT(TIME, statusStart)>='08:00:00' AND CONVERT(TIME, statusStart) < CASE WHEN DATEPART(dw, statusStart)  = 5 THEN '15:30:00' ELSE '22:00:00' END)
       OR (DATEPART(dw, statusFinish) in (2,3,4,5) and CONVERT(TIME, statusFinish)>='08:00:00' AND CONVERT(TIME, statusFinish) < CASE WHEN DATEPART(dw, statusStart)  = 5 THEN '15:30:00' ELSE '22:00:00' END)
   )
AND itemStatus = 'Picking'

Тестируется здесь: https://rextester.com/HXJP15440

...