【发布时间】:2011-12-03 02:31:53
【问题描述】:
我有以下表架构:
RecordId EmpID AbsCode DateFrom DateTo
---------------------------------------------------------------
666542 1511 AB 09/11/2011 10/11/2011
666986 1511 AB 11/11/2011 11/11/2011
666996 1511 EL 13/11/2011 17/11/2011
755485 1787 SL 01/11/2011 14/11/2011
758545 1787 SL 15/11/2011 26/11/2011
796956 1954 AB 09/11/2011 09/11/2011
799656 1367 AB 09/11/2011 09/11/2011
808845 1527 EL 16/11/2011 16/11/2011
823323 1527 EL 17/11/2011 17/11/2011
823669 1527 EL 18/11/2011 18/11/2011
899555 1123 AB 09/11/2011 09/11/2011
990990 1511 AB 12/11/2011 12/11/2011
如您所见,同一员工的数据是单独输入的。假设他报告了一天的SL(病假),输入了数据,然后他第二天打电话报告另一个病假两天..等等。现在我想要的是在将这些条目呈现给客户时合并这些条目,以便合并具有相同缺勤代码的所有连续缺勤。例如,上表应如下所示:
EmpID AbsCode DateFrom DateTo
-------------------------------------------------------------
1511 AB 09/11/2011 12/11/2011
1511 EL 13/11/2011 17/11/2011
1787 SL 01/11/2011 26/11/2011
1954 AB 09/11/2011 09/11/2011
1367 AB 09/11/2011 09/11/2011
1527 EL 16/11/2011 18/11/2011
1123 AB 09/11/2011 09/11/2011
我不是 SQL 人,我可以使用 C# 中的循环来迭代 DataSet 或 DataReader 但我希望在存储过程中使用 T-SQL 来做到这一点。我在 StackOverFlow 中发现了类似的问题,并检查了所有问题,没有一个适用于上述示例表。
编辑: 有时我会遇到这样的情况:
RecordId EmpID AbsCode DateFrom DateTo
---------------------------------------------------------------
666542 1511 AB 09/11/2011 10/11/2011
666986 1511 AB 11/11/2011 25/12/2011
如您所见,该员工从 2011 年 9 月 11 日(d/M/yyyy)到(2011 年 12 月 25 日)缺勤,但客户要求在 12 月 1 日到 12 月 31 日期间缺勤,所以结果应该是:
EmpID AbsCode DateFrom DateTo
-------------------------------------------------------------
1511 AB 01/12/2011 12/11/2011
所以基本上,它将根据提供的参数(从,到)显示结果。如果记录在请求的时间段之前开始,它会显示它,但同时它会根据提供的参数显示记录的开始,同样适用于(从,到)参数之后的记录结束。
【问题讨论】:
-
测试数据错误!所有的日期恰好是连续的。如果员工只有第 1 次和第 30 次缺勤,则应在结果中显示为单独的两行,而不是长时间缺勤。
-
只是为了展示这个想法..随时添加更多
标签: sql-server tsql