该表包含每个记录是唯一事件的位置。每个记录都有一个开始时间和一个结束时间。每个事件代表记录的人/小时数。
我想创建一个查询,该查询在其一天中的每一小时内重复记录一次,并将重复的记录与其所代表的一天中的时间关联起来。我还希望对重复的记录重复主键。
开始和结束时间是日期时间。
我只有读取权限,这限制了我很多。
例如,我的样子:
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
答案 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)