每天输入超过24小时时拆分或复制记录

时间:2014-12-11 16:35:17

标签: sql sql-server stored-procedures

我们有一个缺席系统,人们将总时间放在一边,而不是将其分成不同的记录。所以我的数据看起来像这样

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小时的任何人都将获得他们的记录分割。作为部分日期,任何残差都会在最后加上。

最后(我可以自己动手),我需要注意不要越过一年的结束。

1 个答案:

答案 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