Прошлый полуночный запрос на несколько дней подряд - PullRequest
0 голосов
/ 16 октября 2018

Итак, вот моя проблема.

При первом сдвиге запрос работает нормально.Но для второй смены мне нужно работать в двух частях, потому что время идет после полуночи.

Я хотел бы запустить вторую смену в одном запросе, так как мне нужно вставить в электронную таблицу все данные, но дваждыдля второй смены затем сортируйте. Я пробовал несколько решений, но ни результатов, ни ошибок.

Обратите внимание, что я делаю неделю по запросу, а не каждую неделю, начинающуюся в один и тот же день, или может быть простонесколько дней или в одном случае целый месяц.Все три будут работать так, как нужно для указанного диапазона дат, но было бы неплохо, если бы я мог как-то выполнить один запрос для второй смены.Время второй смены будет с 17:00 до 04:00 или с 17:00 до 04:00 по военному времени.

Заранее спасибо!

   SELECT TOP (100000) 
   [line_ID]
  ,[VIN]
  ,[sequence]
  ,[load_time]

----------------First Shift-------------------------------

 FROM [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
 WHERE line_ID = 100 and  load_time > '10/08/2018' AND load_time <= D 
 ATEADD(day,1,'10/14/2018') 
 AND DATEPART(hour,load_time) >= 5 AND DATEPART(hour,load_time) <= 16
 order by load_time


-------------Second Shift----------------------------------

-------------NEED TO RUN THE TIME PARTS INDEPENDANTLY------
SELECT TOP (100000) 
   [line_ID]
  ,[VIN]
  ,[sequence]
  ,[load_time]


FROM [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
WHERE line_ID = 100 and  load_time > '10/08/2018' AND load_time <= 
DATEADD(day,1,'10/14/2018') 
AND DATEPART(hour,load_time) >= 17 AND DATEPART(hour,load_time) <= 2359
order by load_time


SELECT TOP (100000) 
   [line_ID]
  ,[VIN]
  ,[sequence]
  ,[load_time]

FROM [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
WHERE line_ID = 100 and  load_time > '10/08/2018' AND load_time <= 
DATEADD(day,1,'10/14/2018') 
AND DATEPART(hh,load_time) >= 0 AND DATEPART(hh,load_time) <= 4
order by load_time

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Приведенный ниже подход будет динамически генерировать набор строк, представляющих 2 х 12 часовые смены, для охвата диапазона дат:

declare @start as datetime = '20180901 00:00:00'
declare @finish as datetime = '20181001 00:00:00'

;WITH digits AS (
      SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
      SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
      )
, tally AS (
      SELECT 
              d1s.n 
            + d10s.n * 10
            --+ d100s.n * 100  /* add more like this as needed */
            --+ d1000s.n * 1000  /* add more like this as needed */
            AS n
      FROM digits d1s
      CROSS JOIN digits d10s
      --CROSS JOIN digits d100s /* add more like this as needed */
      --CROSS JOIN digits d1000s /* add more like this as needed */
      )
, range as (
    select
         n
       , dateadd(hour,5,dateadd(day,n-1,@start))  shift1_start
       , dateadd(hour,17,dateadd(day,n-1,@start)) shift2_start
       , dateadd(hour,29,dateadd(day,n-1,@start)) next_shift1_start
    from tally
    where dateadd(day,n-1,@start) <= @finish
    )
select t.*
from range
inner join [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in] AS t 
    ON t.load_time >= range.shift2_start and t.load_time < next_shift1_start
order by t.load_time

см. Это продемонстрировано здесь: https://rextester.com/ODUNU15588

nb:Если вам нужно больше строк, просто следуйте той же схеме перекрестных соединений и расчета, как показано.Кроме того, если у вас уже есть таблица чисел или календарь, вы можете использовать ее вместо этого.Сгенерированные границы смены выглядят следующим образом (дд.мм.гггг):

       n       shift1_start          shift2_start        next_shift1_start      
 ---- ---- --------------------- --------------------- --------------------- 
   1    0   31.08.2018 05:00:00   31.08.2018 17:00:00   01.09.2018 05:00:00  
   2    1   01.09.2018 05:00:00   01.09.2018 17:00:00   02.09.2018 05:00:00  
...
  31   30   30.09.2018 05:00:00   30.09.2018 17:00:00   01.10.2018 05:00:00  
  32   31   01.10.2018 05:00:00   01.10.2018 17:00:00   02.10.2018 05:00:00 

Использование этого подхода к вашей проблеме позволяет выбирать данные для одной смены в одном запросе или различать данные пообе смены в одном запросе.

0 голосов
/ 17 октября 2018

Все, что вам нужно, это OR в пределах where clause, чтобы включить оба разрешенных набора часов:

select
*
from [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
WHERE load_time > '10/08/2018' 
AND load_time <=  DATEADD(day,1,'10/14/2018') 
AND ((DATEPART(hour,load_time) >= 0 AND DATEPART(hh,load_time) <= 4)
   OR
     (DATEPART(hour,load_time) >= 17 AND DATEPART(hour,load_time) <= 23)
     )
order by load_time
;

также см .: https://rextester.com/SUM30585

0 голосов
/ 16 октября 2018

Если ваши запросы возвращают правильный результат, подход easy-cheesy был UNION ALL:

SELECT t.*
FROM
(
        SELECT TOP (100000)
           'Query 1' AS Querymarker
          ,[line_ID]
          ,[VIN]
          ,[sequence]
          ,[load_time]

        FROM [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
        WHERE line_ID = 100 and  load_time > '10/08/2018' AND load_time <= 
        DATEADD(day,1,'10/14/2018') 
        AND DATEPART(hour,load_time) >= 17 AND DATEPART(hour,load_time) <= 2359

        UNION ALL    

        SELECT TOP (100000) 
           'Query 2' AS Querymarker
          ,[line_ID]
          ,[VIN]
          ,[sequence]
          ,[load_time]

        FROM [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
        WHERE line_ID = 100 and  load_time > '10/08/2018' AND load_time <= 
        DATEADD(day,1,'10/14/2018') 
        AND DATEPART(hh,load_time) >= 0 AND DATEPART(hh,load_time) <= 4
    ) t
    order by t.load_time;

Подсказка 1

Я добавил Querymarkerстолбец, который позволяет увидеть, какой запрос возвратил строку, но это - предположительно - не нужно, и вы можете удалить ее ...

Подсказка 2

Вам следует избегать даты, зависящей от культурыформаты.10/08/2018 может быть 10 августа или 8 октября, в зависимости от настроек вашего аппарата.Попробуйте использовать независимые настройки, в вашем случае я буду стремиться к неразделенным '20181008' (с кавычками это будет 8 октября в любом случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...