我们有一个缺席系统,人们将总时间放在一边,而不是将其分成不同的记录。所以我的数据看起来像这样
EMP_ID | HOURS | DATE
---------|-----------|------------
1 | 24 | 2013-10-10
2 | 8 | 2013-11-06
3 | 48 | 2013-11-13
4 | 51 | 2013-12-10
我需要一个查询(这最终可能是一个存储过程),它会像这样带回数据
EMP_ID | HOURS | DATE
-------------|-----------|-------------
1 | 24 | 2013-10-10
2 | 8 | 2013-11-06
3 | 24 | 2013-11-13
3 | 24 | 2013-11-14
4 | 24 | 2013-12-10
4 | 24 | 2013-12-11
4 | 3 | 2013-12-12
注意一天如何增加1.进入超过24小时的任何人都将获得他们的记录分割。作为部分日期,任何残差都会在最后加上。
最后(我可以自己动手),我需要注意不要越过一年的结束。
答案 0 :(得分:1)
如果这是SQL Server,您可以使用递归CTE。
<强> SQL Fiddle Demo 强>
with cte as
(
select emp_id,
hours as tHours,
case when hours >= 24 then 24 else hours end as hours,
date
from YourTable
UNION ALL
select c.emp_id,
c.thours - (case when c.thours >= 24 then 24 else c.hours end),
case when (c.thours - (case when c.thours >= 24 then 24 else c.hours end)) >= 24 then 24 else c.thours - 24 end,
dateadd(day, 1, c.date)
from cte c
join YourTable m on c.thours - 24 > 0 and m.emp_id = c.emp_id
)
select emp_id,
hours,
date
from cte
order by emp_id, date