Данные SQL по дате в дневном и ночном сегментах - PullRequest
0 голосов
/ 26 октября 2019

Нам нужно получить данные за 2 дня в дневном и ночном сегментах (время сегмента определяется заказчиком). Скажем, если клиент говорит, что с 25.10.2009 8:00, это означает, что нам нужно получить данные для этих дат.

10/25/2019 8AM - 10/25/2019 8PM (Day DateTime)
10/25/2019 8PM - 10/26/2019 8AM (Night DateTime)
10/26/2019 8AM - 10/26/2019 8PM (Day DateTime)
10/26/2019 8PM - 10/27/2019 8AM (Night DateTime)

Теперь мы передаем эти даты в виде XML в хранимую процедуру, и теперь мой вопросКаков наилучший способ просмотреть каждую строку даты и получить данные по столбцам (Дата, День, Ночь)? Я думал о реализации курсора, но есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Я создаю вам пример данных с помощью запроса ниже

SELECT X,Y
    FROM 
    (
        VALUES 
            ('10/25/2019 8AM','10/25/2019 8PM'),
            ('10/25/2019 8PM','10/26/2019 8AM'),
            ('10/26/2019 8AM','10/26/2019 8PM'),
            ('10/26/2019 8PM','10/27/2019 8AM')
    ) AS F(X , Y)

и его результатов этого запроса

X              Y
-------------- --------------
10/25/2019 8AM 10/25/2019 8PM
10/25/2019 8PM 10/26/2019 8AM
10/26/2019 8AM 10/26/2019 8PM
10/26/2019 8PM 10/27/2019 8AM

и пишу этот код поверх ваших данных

SELECT *, 
        CONVERT(DATE,X) AS 'Date' ,
        'DAY & NIGHT' = CASE WHEN DATEPART(HOUR,CONVERT(DATETIME,X)) < 12 THEN 'AM' 
        ELSE 'PM' END
FROM 
(
    SELECT X,Y
    FROM 
    (
        VALUES 
            ('10/25/2019 8AM','10/25/2019 8PM'),
            ('10/25/2019 8PM','10/26/2019 8AM'),
            ('10/26/2019 8AM','10/26/2019 8PM'),
            ('10/26/2019 8PM','10/27/2019 8AM')
    ) AS F(X , Y)
) AS T

и это результат моего запроса

X              Y              Date       DAY & NIGHT
-------------- -------------- ---------- -----------
10/25/2019 8AM 10/25/2019 8PM 2019-10-25 AM
10/25/2019 8PM 10/26/2019 8AM 2019-10-25 PM
10/26/2019 8AM 10/26/2019 8PM 2019-10-26 AM
10/26/2019 8PM 10/27/2019 8AM 2019-10-26 PM

ПРИМЕЧАНИЕ

ваша структура дат неверна, и вы будете конвертировать в строку для своих данных, если конвертируете базовые данныев качестве datetime вы повышаете производительность и не хотите преобразовывать в datetime в выражении case

NOTE при преобразовании данных в качестве datetime сервер sql дает 24 структурных времени, затем до 12 часов утра и послеэто PM

0 голосов
/ 26 октября 2019

Скажем, если клиент говорит, что с 25.10.2009 8:00, это означает, что нам нужно получить данные за эти даты.

В противном случае ваш вопрос довольно расплывчатый. Вы можете построить периоды времени, используя CTE. Затем вы можете присоединиться к исходным данным, чтобы получить счет (или что-то еще) за периоды времени:

with cte as (
      select dateadd(hour, v.h1, d.dt) as dt_start,
             dateadd(hour, v.h2, d.dt) as dt_end,
             v.segment
      from (values (convert(datetime, '2019-10-25 8:00:00'))
           ) d(dt) cross join
           (values (0, 12, 'day'),
                   (12, 24, 'night'),
                   (24, 36, 'day'),
                   (36 48, 'night')
           ) v(h1, h2, segment)
     )
select cte.dt_start, cte.dt_end, cte.segment,
       count(t.id)
from t left join
     cte
     on t.dt >= cte.dt_start and
        t.dt < cte.dt_end
group by cte.dt_start, cte.dt_end, cte.segment
order by cte.dt_start;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...