SQL Server - рассчитайте количество часов между двумя разами и разбейте эти часы на три периода времени - PullRequest
0 голосов
/ 28 июня 2018

Я использую SQL Server 2008 и не знаю, с чего начать этот расчет. Буду очень признателен за любую помощь.

У меня есть два столбца, StartTime и EndTime. У меня есть три диапазона времени: утром с 12:00 до 7:59, днем ​​с 8:00 до 3:59 (или 15:39) вечера и вечером с 16:00 (или 16:00) до 11:59 (или 23:59) вечера.

Я хочу рассчитать количество часов между StartTime и EndTime, которые принадлежат каждому диапазону. Например, для первого ряда, приведенного ниже, между 6:00 и 17:00 есть 11 часов, а утром 2 часа, 8 часов днем ​​и 1 час вечером. Итак, я хочу четыре столбца: один для 11 часов, по одному для утренних, дневных и вечерних прорывов.

StartTime               EndTime
2017-10-25 06:00:00.000 2017-10-25 17:00:00.000
2017-10-26 05:30:00.000 2017-10-26 18:00:00.000
2017-10-30 07:00:00.000 2017-10-30 17:30:00.000
2017-11-01 06:00:00.000 2017-11-01 17:30:00.000
2017-10-06 04:00:00.000 2017-10-06 05:00:00.000
2016-04-28 04:00:00.000 2016-04-28 10:00:00.000
2017-06-30 04:00:00.000 2017-07-01 00:00:00.000
2016-01-26 06:30:00.000 2016-01-26 19:00:00.000
2017-08-15 07:00:00.000 2017-08-15 19:30:00.000
2016-01-28 07:00:00.000 2016-01-28 19:30:00.000

Желаемые результаты, используя первый

NbrHours = 11   
MorningHrs  = 2
DayHrs  = 8
EveningHrs = 1

1 Ответ

0 голосов
/ 29 июня 2018

Что-то похожее на это должно помочь вам ...

drop table if exists #times;
go

create table #times(
    StartTime datetime ,
    EndTime datetime
);

insert #times values
('2017-10-25 06:00:00.000', '2017-10-25 17:00:00.000'),
('2017-10-26 05:30:00.000', '2017-10-26 18:00:00.000'),
('2017-10-30 07:00:00.000', '2017-10-30 17:30:00.000'),
('2017-11-01 06:00:00.000', '2017-11-01 17:30:00.000'),
('2017-10-06 04:00:00.000', '2017-10-06 05:00:00.000'),
('2016-04-28 04:00:00.000', '2016-04-28 10:00:00.000'),
('2017-06-30 04:00:00.000', '2017-07-01 00:00:00.000'),
('2016-01-26 06:30:00.000', '2016-01-26 19:00:00.000'),
('2017-08-15 07:00:00.000', '2017-08-15 19:30:00.000'),
('2016-01-28 07:00:00.000', '2016-01-28 19:30:00.000')
;

with
    a as (
        select  StartTime ,
                EndTime ,
                datepart(hour, StartTime) as StartHour ,
                datepart(hour, StartTime) + datediff(hour, StartTime, EndTime) as EndHour
        from    #times
    )
select  a.StartTime,
        a.EndTime ,
        StartHour ,
        EndHour ,
        EndHour - StartHour as Total ,
        case when EndHour > 8 then 8 else EndHour end - case when StartHour < 0 then 0 else StartHour end as Morning ,
        case when EndHour > 16 then 16 else EndHour end - case when StartHour < 8 then 8 else StartHour end as Afternoon ,
        case when EndHour > 24 then 24 else EndHour end - case when StartHour < 16 then 16 else StartHour end as Evening
from    a
;

enter image description here

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