日期:2014-05-17  浏览次数:20522 次

[求助]如何请假时间段分解生成一天一条记录。
原始数据

员工ID    员工名    假别    请假开始时间         请假结束时间 
 001       张三     事假     2013-10-16 08:00    2013-10-20 17:20


前提:
1.上班时间是08:00  下班时间是17:20 
2.不需要考虑时间段的假期,每天生成一条记录即可

结果:
员工ID    员工名    假别    请假开始时间         请假结束时间 
 001       张三     事假     2013-10-16 08:00    2013-10-16 17:20
 001       张三     事假     2013-10-17 08:00    2013-10-17 17:20
 001       张三     事假     2013-10-18 08:00    2013-10-18 17:20
 001       张三     事假     2013-10-19 08:00    2013-10-19 17:20
 001       张三     事假     2013-10-20 08:00    2013-10-20 17:20


------解决方案--------------------
spt_values
------解决方案--------------------
create table #tb(员工ID varchar(10),员工名  varchar(10),
假别  varchar(10),请假开始时间 datetime,请假结束时间 datetime)
insert into #tb
values('001','张三','事假','2013-10-16 08:00','2013-10-20 17:20')

select distinct a.员工ID,a.员工名,a.假别, dateadd(day,b.number,a.请假开始时间) as 请假开始时间,
convert(varchar(11),dateadd(day,b.number,a.请假开始时间),120)+convert(varchar(8),a.请假结束时间,108) as 请假结束时间
from #tb a,master..spt_values b
where b.number between 0 and 4

/*
员工ID 员工名 假别 请假开始时间 请假结束时间
001 张三 事假 2013-10-16 08:00:00.000 2013-10-16 17:20:00
001 张三 事假 2013-10-17 08:00:00.000 2013-10-17 17:20:00
001 张三 事假 2013-10-18 08:00:00.000 2013-10-18 17:20:00
001 张三 事假 2013-10-19 08:00:00.000 2013-10-19 17:20:00
001 张三 事假 2013-10-20 08:00:00.000 2013-10-20 17:20:00
*/



------解决方案--------------------

IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb
CREATE TABLE tb([员工ID] VARCHAR(5),[员工名] NVARCHAR(5),[假别] NVARCHAR(40),[请假开始时间] VARCHAR(16),[请假结束时间] VARCHAR(16))
INSERT INTO tb([员工ID],[员工名],[假别],[请假开始时间],[请假结束时间])
SELECT '001','张三','事假','2013-10-16 08:00','2013-10-20 17:20'

declare @time1 varchar(6),@time2 varchar(6)
set @time1=' 08:00'
set @time2=' 17:20'
select  b.[员工ID],b.[员工名],b.[假别]
,convert(varchar(10),dateadd(dd,a.number,b.[请假开始