我有一些数据存储在这样的表中:
I have some data stored in a table like this:
VacationId VacationDate VacationDuration_Hr 1 2018/01/24 4 2 2018/03/21 60 3 2018/08/16 33 4 2018/12/01 8我希望能够将较长的时间段分解为几个较短的时间段,最大长度为 24 小时,如下所示:
I'd like to be able to break down the longer time periods into several shorter ones with the max length of 24hr like this:
VacationDate VacationDuration_Hr 2018/01/24 4 2018/03/21 24 2018/03/22 24 2018/03/23 12 2018/08/16 24 2018/08/17 9 2018/12/01 8没有游标有什么技巧吗?提前致谢
Is there a trick to do it without cursors? Thanks In advance
推荐答案我在这里使用的方法是创建额外行的 Tally Table.我 JOIN 到计数表上,其中小时数/24(整数数学很有用)大于计数值,然后可以使用它来计算小时数.
The method I have used here is a Tally Table to create extra rows. I JOIN onto the tally table where the number of hours / 24 (integer maths is useful) is greater than the tally number, and then can use that to calculate the hours.
WITH YourTable AS( SELECT * FROM (VALUES(1,CONVERT(date,'2018/01/24',111),4 ), (2,CONVERT(date,'2018/03/21',111),40), (3,CONVERT(date,'2018/08/16',111),33), (4,CONVERT(date,'2018/12/01',111),8 ), (5,CONVERT(date,'2018/12/17',111),56 ), (6,CONVERT(date,'2018/12/17',111),24 ))V(VacationID,VacationDate,VacationDuration_Hr)), --Solution N AS( SELECT N FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL))N(N)), Tally AS( SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I FROM N N1, N N2) -- 25 days, add more for more days SELECT YT.VacationID, DATEADD(DAY, T.I, YT.VacationDate) AS VacationDate, CASE WHEN VacationDuration_Hr - (T.I * 24) > 24 THEN 24 ELSE YT.VacationDuration_Hr - (T.I * 24) END AS VacationDuration_Hr FROM YourTable YT JOIN Tally T ON (YT.VacationDuration_Hr -1) / 24 >= T.I ORDER BY YT.VacationID, T.I;您可以也可以在这里使用 rCTE,但是,我倾向于避免使用 rCTE;特别是当我不知道 VacationDuration_Hr 的值的上限可能是什么时.如果它很大,则可能会对性能产生一些不利影响,并且 Tally 的性能将明显优于 rCTE 的 RBAR 性质.
You could also use an rCTE here instead, however, I tend to avoid those for things like this; especially when I have no context of what the upper limit to the value of VacationDuration_Hr could be. if it is large it could have some nasty performance implications and a Tally will significantly out perform the RBAR nature of an rCTE.
更多推荐
将长时间的多日时间段分解为几个单日时间段
发布评论