日期:2014-05-18 浏览次数:20643 次
declare @hrmexcuse table ( 人员编号 int,请假开始日期 VARCHAR(10),请假开始时间 VARCHAR(5), 请假结束日期 VARCHAR(10),请假结束时间 VARCHAR(5) ) insert into @hrmexcuse select 22200011,'2012-01-11' ,'08:00','2012-01-12','12:00' union all select 22200011,'2012-01-18' ,'11:00','2012-01-21' ,'11:00' union all select 22200011,'2012-01-30' ,'08:00','2012-01-31' ,'16:30' --分步处理相对容易一些 --按天展开,插入临时表进行处理,以免影响原始数据 SELECT 人员编号 ,CAST(a.请假开始日期 AS DATETIME) + b.number AS 请假开始日期 , 请假开始时间 ,请假结束日期 ,请假结束时间 , b.number ,1.00 AS 请假时间 ,0 AS 星期 ,0 AS 状态 INTO #t FROM @hrmexcuse a LEFT JOIN master..spt_values b ON CAST(a.请假开始日期 AS DATETIME) + b.number <= CAST(a.请假结束日期 AS DATETIME) WHERE b.type = 'p' --设置星期一为一个星期的第一天 SET DATEFIRST 1 --更新星期字段 UPDATE #t SET 星期 = DATEPART(weekday, 请假开始日期) --如果日期段中有星期天,更新为0 UPDATE #t SET 请假时间 = 0 ,状态 = 1 WHERE 星期 = 7 --设计部分日期的开始时间 UPDATE #t SET 请假开始时间 = CASE WHEN number = 0 THEN 请假开始时间 WHEN number <> 0 AND 星期 <> 6 THEN '08:00' WHEN number <> 0 AND 星期 = 6 THEN '08:30' END --连续日期的话除收尾外,更新为整天时间 UPDATE #t SET 请假时间 = CASE 星期 WHEN 6 THEN 2.5 ELSE 7.5 END ,状态 = 1 FROM #t t WHERE number NOT IN ( SELECT MAX(number) FROM #t WHERE 请假结束日期 = t.请假结束日期 AND 请假结束时间 = t.请假结束时间 UNION ALL SELECT 0 ) AND 星期 <> 7 --不是最后一天的话,结束时间应该是17.30 UPDATE #t SET 请假结束时间 = '17:30' FROM #t t WHERE number NOT IN ( SELECT MAX(number) FROM #t WHERE 请假结束日期 = t.请假结束日期 AND 请假结束时间 = t.请假结束时间 ) UPDATE #t SET 请假时间 = CASE WHEN '12:00' BETWEEN 请假开始时间 AND 请假结束时间 AND '14:00' BETWEEN 请假开始时间 AND 请假结束时间 THEN ( DATEDIFF(mi, CAST(请假开始日期 + ' ' + 请假开始时间 AS DATETIME), CAST(请假开始日期 + ' ' + 请假结束时间 AS DATETIME)) - 120 ) / 60.0 ELSE ( DATEDIFF(mi, CAST(请假开始日期 + ' ' + 请假开始时间 AS DATETIME), CAST(请假开始日期 + ' ' + 请假结束时间 AS DATETIME)) ) / 60.0 END WHERE 状态 = 0 SELECT 人员编号,convert(VARCHAR(10),请假开始日期,120) AS 请假日期,请假时间 ,星期 FROM #t /* 人员编号 请假日期 请假时间 星期 ----------- ---------- --------------------------------------- ----------- 22200011 2012-01-11 7.50 3 22200011 2012-01-12 4.00 4 22200011 2012-01-18 4.50 3 22200011 2012-01-19 7.50 4 22200011 2012-01-20 7.50 5 22200011 2012-01-21 2.50 6 22200011 2012-01-30 7.50 1 22200011 2012-01-31 6.50 2 */ DROP TABLE #t
------解决方案--------------------
create table hrmexcuse(人员编号 varchar(10),请假开始日期 varchar(10),请假开始时间 varchar(8),请假结束日期 varchar(10),请假结束时间 varchar(8))