将开始时间和结束时间转换为每小时记录的查询
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)
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)