我正在尝试使用SQL Server将日期/时间数据的范围扩展到多行中。例如,我的数据如下所示
Date StartTime EndTime EmployeeID ShiftType
10/1/2019 8:30:00AM 4:57:00PM 52148 Shift
10/2/2019 9:00:00AM 5:24:00PM 72156 Shift
10/2/2019 8:27:00AM 4:40:00PM 59232 Shift
我想将日期和时间的范围按小时展开到多行中。它将如下所示:
Date StartTime EndTime EmployeeID ShiftType
10/1/2019 8:30:00AM 9:00:00PM 52148 Shift
10/1/2019 9:00:00AM 10:00:00PM 52148 Shift
10/1/2019 10:00:00AM 11:00:00PM 52148 Shift
10/1/2019 11:00:00AM 12:00:00PM 52148 Shift
10/1/2019 12:00:00AM 1:00:00PM 52148 Shift
10/1/2019 1:00:00AM 2:00:00PM 52148 Shift
10/1/2019 2:00:00AM 3:00:00PM 52148 Shift
10/1/2019 3:00:00AM 4:00:00PM 52148 Shift
10/1/2019 4:30:00AM 4:57:00PM 52148 Shift
10/2/2019 9:00:00AM 10:00:00PM 72156 Shift
10/2/2019 10:00:00AM 11:00:00PM 72156 Shift
.......
如果开始时间是8:20,我想为前40分钟创建一个单独的行,这样它就可以是8:20 - 9:00,然后是9:00-10:同样的事情也适用于结束时间。我累了这样的东西,但显然它是行不通的,因为我想基于一个小时的单位来分割它们。
Declare @StartDate DATETIME = '2016-09-26 00:00:00.000';
With SampleDateTable AS
(
SELECT @StartDate AS myDate
UNION ALL
SELECT DATEADD(Day,1,myDate)
FROM Sheet1$
WHERE DATEADD(Day,1,myDate) <= GETDATE()
)
SELECT
EmployeeID,
a.myDate,
FROM SampleDateTable a
INNER JOIN
(
SELECT EmployeeID, MIN(StartTime) MinStartTime
FROM Sheet1$
GROUP BY EmployeeID
) EachEmployee ON
a.MyDate >= EachEmployee.MinStartTime
LEFT JOIN
Sheet1$ S ON
EachEmployee.EmployeeID = S.EmployeeID AND
a.myDate >= S.StartDate AND
a.myDate <= ISNULL(S.EndDate, GETDATE())
ORDER BY EachEmployee.EmployeeID DESC, a.MyDate
OPTION (MAXRECURSION 0)
我会很感激你的帮助谢谢。
2条答案
按热度按时间7cwmlq891#
下面是一个使用临时计数表的选项
示例
退货
4xrmg8kj2#
对于递归查询,您应该从示例数据开始,然后从那里进行调整。
在递归查询中,我们添加了一个额外的列:下一个小时的边界,也就是
NextTime
。例如,对于StartTime
8:27,下一个小时的边界是9:00。在递归时,我们将其作为下一个StartTime
,并重复执行,直到达到EndTime
。在结果查询中,我们隐藏了
NextTime
列,但选择NextTime
和EndTime
中较早的一个作为结果行的EndTime
。由于递归不能提供良好顺序的数据,我们还需要按StartTime
进行排序。有关工作示例,请参阅SQL Fiddle。