【问题标题】:SQL Server - Calculate the number of hours between two times and break out those hours into three time periodsSQL Server - 计算两次之间的小时数并将这些小时分成三个时间段
【发布时间】:2018-06-28 16:10:55
【问题描述】:

我使用的是 SQL Server 2008,甚至不知道从哪里开始这个计算。我非常感谢您能提供的任何帮助。

我有两列,StartTime 和 EndTime。我有三个时间范围:早上 12:00 am - 7:59 am,白天 8:00 am 到 3:59(或 15:39)pm,晚上 4:00 pm(或 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

【问题讨论】:

  • 您的日期/时间值总是在同一天吗?那么部分时间呢?你应该展示你想要的结果。
  • 感谢您的评论。不,他们并不总是在同一天。对于部分小时,我只想要小时而不是分钟。所以我会用小时来确定它所属的范围。我将更新以显示部分预期结果。进入不同的日子没关系,我只需要三个范围。

标签: sql-server time


【解决方案1】:

类似的东西应该可以为您解决问题...

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
;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多