将开始时间和结束时间转换为每小时记录的查询

Query that converts a start time and an end time into hourly records

table 包含每个记录都是唯一事件的地方。每条记录都有开始时间和结束时间。每个事件代表 man/hours 记录。

我想创建一个查询,在记录跨越一天中的每一小时时将每条记录复制一次,并将重复的记录与其代表的一天中的小时相关联。我还希望主键与重复记录重复。

开始和结束时间是日期时间。

我只有读取权限,这限制了我很多。

举个例子,我的样子是这样的:

pk   StartTime           EndTime

1     Start date 1am   End date 3am

我想要的是:

pk   HourOfDay 

1     1 am
1     2 am

我想在单个查询结果中对 table 中的所有记录使用此方法。

目的是确定一天中真正最繁忙的时间,并确定服务需求高于人员配备水平的日子。

自 Dale Burrell 的回答以来,我尝试过以推荐的方式加入 table 变量,但我在条件加入方面遇到了困难。

我尝试过的是,在按照下面解决方案 1 中的建议创建 table 变量后,我尝试了以下条件连接并不断出现语法错误:

select
  T.id
  ,H.[Hour]
from
  @TimeSheet as T
  inner join @Hour as H on 
    case
        when datepart(hour, StartTime) < datepart(hour, EndTime)
        then H.[Hour] >= datepart(hour, T.StartTime) 
             and H.hour < datepart(hour, T.EndTime)

        when datepart(hour, StartTime) > datepart(hour, EndTime)
        then H.[Hour] <= datepart(hour, T.StartTime) 
             and H.hour > datepart(hour, T.EndTime)

        else datepart(hour, StartTime) = H.[Hour]
     end

案例 1 的示例数据,开始时间 > 结束时间

pk   start                   end
1    '2018-01-01 01:00:000'  '2018-01-01 02:00:00

案例 2 的示例数据,开始时间 < 结束时间

pk   start                   end
1    '2018-01-01 22:00:000'  '2018-01-02 01:00:00

案例 3 的示例数据,开始时间 = 结束时间

pk   start                   end
1    '2018-01-01 01:00:000'  '2018-01-01 01:30:00

以下内容与您正在寻找的类似。我为您留下了边缘情况,尤其是午夜情况 :)

declare @Hour table ([Hour] int)
declare @TimeSheet table (id int, StartTime time, EndTime time)

insert into @Hour ([Hour])
  select 0
  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
  union all select 10
  union all select 11

insert into @TimeSheet (id, StartTime, EndTime)
  select 1, '01:00', '03:00'

select T.id, H.[Hour]
from @TimeSheet T
inner join @Hour H on H.[Hour] >= datepart(hour, T.StartTime) and H.[Hour] < datepart(hour, T.EndTime)