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

时间:2018-12-27 23:32:44

标签: sql sql-server readonly

该表包含每个记录是唯一事件的位置。每个记录都有一个开始时间和一个结束时间。每个事件代表记录的人/小时数。

我想创建一个查询,该查询在其一天中的每一小时内重复记录一次,并将重复的记录与其所代表的一天中的时间关联起来。我还希望对重复的记录重复主键。

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

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

例如,我的样子:

pk   StartTime           EndTime

1     Start date 1am   End date 3am

我想要的是:

pk   HourOfDay 

1     1 am
1     2 am

我希望在单个查询结果中为表中的所有记录提供此功能。

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

自从Dale Burrell的回答非常有效以来,我一直尝试以推荐的方式连接表变量,但是我很难进行条件连接。

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

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





sample data for case 1, start hour > end hour

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


sample data for case 2, start hour < end hour

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

sample data for case 3, start hour = end hour

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

1 个答案:

答案 0 :(得分:0)

以下内容与您所寻找的类似。我已经为您留了边箱,特别是午夜的箱子:)

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)