34,576
社区成员
发帖
与我相关
我的任务
分享
USE Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(22),[type] nvarchar(22),[lr_frm] Date,[frm_hrs] int,[f_hrs_s] int,[lr_to] Date,[to_hrs] int,[to_hrs_s] int,[lr_hrs] decimal(18,2))
Insert #T
select 1,N'张三',N'事假','2016-05-18',9,0,'2016-05-18',18,0,8.00 union all
select 2,N'李四',N'病假','2016-05-19',9,0,'2016-05-20',12,0,12.00 union all
select 3,N'王五',N'事假','2016-05-21',15,30,'2016-05-22',12,0,5.50 union all
select 4,N'赵六',N'病假','2016-05-10',10,30,'2016-05-11',12,0,9.50 union all
select 5,N'田七',N'婚假','2016-06-30',10,30,'2016-07-01',10,30,8.00
Go
SELECT a.ID ,
a.Name ,
a.type ,
CAST(CAST(a.lr_frm AS DATETIME) + b.number - 1 AS DATE) AS lr_frm ,
a.frm_hrs ,
'07:00' AS [Postdate] ,
CAST(CAST(a.lr_frm AS DATETIME)+ b.number - 1 AS DATE) AS lr_to ,
a.to_hrs ,
a.to_hrs_s ,
a.lr_hrs,
[Enddate]=CONVERT(VARCHAR(5),
DATEADD(n,
CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,'09:00',StartTime)
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60)-1)%480+1 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'18:00')
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60)-1)%480+1 END
END ,CAST(a.lr_frm AS DATETIME) +'07:00'+ b.number - 1), 8),
[lr_hrs2]=CAST(CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN (480-DATEDIFF(n,'09:00',StartTime))/60.0
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60-1)%480+1)/60.0 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'18:00')/60.0
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60-1)%480+1)/60.0 END
END AS DECIMAL(18,2))
FROM (SELECT *,StartTime=CAST(RTRIM([frm_hrs])+':'+RTRIM([f_hrs_s]) AS DATETIME),EndTime=CAST(RTRIM([to_hrs]+1)+':'+RTRIM([to_hrs_s]) AS DATETIME) FROM #T ) AS a
,master.dbo.spt_values AS b
WHERE b.type = 'P'
AND b.number >= 1
AND(
CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) >= b.number AND a.StartTime<='12:00'
OR
a.StartTime>='12:00' AND CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) >= b.number
)
/*
ID Name type lr_frm frm_hrs Postdate lr_to to_hrs to_hrs_s lr_hrs Enddate lr_hrs2
1 张三 事假 2016-05-18 9 07:00 2016-05-18 18 0 8.00 15:00 8.00
2 李四 病假 2016-05-19 9 07:00 2016-05-19 12 0 12.00 15:00 8.00
2 李四 病假 2016-05-20 9 07:00 2016-05-20 12 0 12.00 11:00 4.00
3 王五 事假 2016-05-21 15 07:00 2016-05-21 12 0 5.50 09:30 2.50
3 王五 事假 2016-05-22 15 07:00 2016-05-22 12 0 5.50 10:00 3.00
4 赵六 病假 2016-05-10 10 07:00 2016-05-10 12 0 9.50 13:30 6.50
4 赵六 病假 2016-05-11 10 07:00 2016-05-11 12 0 9.50 10:00 3.00
5 田七 婚假 2016-06-30 10 07:00 2016-06-30 10 30 8.00 13:30 6.50
5 田七 婚假 2016-07-01 10 07:00 2016-07-01 10 30 8.00 08:30 1.50
*/
USE Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(22),[type] nvarchar(22),[lr_frm] Date,[frm_hrs] int,[f_hrs_s] int,[lr_to] Date,[to_hrs] int,[to_hrs_s] int,[lr_hrs] decimal(18,2))
Insert #T
select 1,N'张三',N'事假','2016-05-18',9,0,'2016-05-18',18,0,8.00 union all
select 2,N'李四',N'病假','2016-05-19',9,0,'2016-05-20',12,0,12.00 union all
select 3,N'王五',N'事假','2016-05-21',15,30,'2016-05-22',12,0,5.50 union all
select 4,N'赵六',N'病假','2016-05-10',10,30,'2016-05-11',12,0,9.50 union all
select 5,N'田七',N'婚假','2016-06-30',10,30,'2016-07-01',10,30,8.00
Go
SELECT a.ID ,
a.Name ,
a.type ,
CAST(CAST(a.lr_frm AS DATETIME) + b.number - 1 AS DATE) AS lr_frm ,
a.frm_hrs ,
'07:00' AS [Postdate] ,
CAST(CAST(a.lr_frm AS DATETIME)+ b.number - 1 AS DATE) AS lr_to ,
a.to_hrs ,
a.to_hrs_s ,
a.lr_hrs,
[Enddate]=CONVERT(VARCHAR(5),
DATEADD(n,
CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,'09:00',StartTime)
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60)-1)%480+1 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60)-1)%480+1 END
END ,CAST(a.lr_frm AS DATETIME) +'07:00'+ b.number - 1), 8),
[lr_hrs2]=CAST(CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN (480-DATEDIFF(n,'09:00',StartTime))/60.0
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60-1)%480+1)/60.0 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'18:00')/60.0
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60-1)%480+1)/60.0 END
END AS DECIMAL(18,2))
FROM (SELECT *,StartTime=CAST(RTRIM([frm_hrs])+':'+RTRIM([f_hrs_s]) AS DATETIME),EndTime=CAST(RTRIM([to_hrs]+1)+':'+RTRIM([to_hrs_s]) AS DATETIME) FROM #T ) AS a
,master.dbo.spt_values AS b
WHERE b.type = 'P'
AND b.number >= 1
AND(
CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) >= b.number AND a.StartTime<='12:00'
OR
a.StartTime>='12:00' AND CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) >= b.number
)
/*
ID Name type lr_frm frm_hrs Postdate lr_to to_hrs to_hrs_s lr_hrs Enddate lr_hrs2
1 张三 事假 2016-05-18 9 07:00 2016-05-18 18 0 8.00 15:00 8.00
2 李四 病假 2016-05-19 9 07:00 2016-05-19 12 0 12.00 15:00 8.00
2 李四 病假 2016-05-20 9 07:00 2016-05-20 12 0 12.00 11:00 4.00
3 王五 事假 2016-05-21 15 07:00 2016-05-21 12 0 5.50 15:00 2.50
3 王五 事假 2016-05-22 15 07:00 2016-05-22 12 0 5.50 10:00 3.00
4 赵六 病假 2016-05-10 10 07:00 2016-05-10 12 0 9.50 13:30 6.50
4 赵六 病假 2016-05-11 10 07:00 2016-05-11 12 0 9.50 10:00 3.00
5 田七 婚假 2016-06-30 10 07:00 2016-06-30 10 30 8.00 13:30 6.50
5 田七 婚假 2016-07-01 10 07:00 2016-07-01 10 30 8.00 08:30 1.50
*/
Create table #T([ID] int,[Name] nvarchar(22),[type] nvarchar(22),[lr_frm] Date,[frm_hrs] int,[f_hrs_s] int,[lr_to] Date,[to_hrs] int,[to_hrs_s] int,[lr_hrs] decimal(18,2))
Insert #T
select 1,N'张三',N'事假','2016-05-18',9,0,'2016-05-18',18,0,8.00 union all
select 2,N'李四',N'病假','2016-05-19',9,0,'2016-05-20',12,0,12.00 union all
select 3,N'王五',N'事假','2016-05-21',15,30,'2016-05-22',12,0,5.50 union all
select 4,N'赵六',N'病假','2016-05-10',10,30,'2016-05-11',12,0,9.50 union all
select 5,N'田七',N'婚假','2016-06-30',10,30,'2016-07-01',10,30,8.00
Go
--drop table #T
SELECT a.ID ,
a.Name ,
a.type ,
CAST(CAST(a.lr_frm AS DATETIME) + b.number - 1 AS DATE) AS lr_frm ,
--a.frm_hrs ,
'07:00' AS [Postdate] ,
CAST(CAST(a.lr_frm AS DATETIME)+ b.number - 1 AS DATE) AS lr_to ,
--a.to_hrs ,
--a.to_hrs_s ,
--a.lr_hrs,
[Enddate]=CONVERT(VARCHAR(5),
DATEADD(n,
CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,'09:00',StartTime)
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60)-1)%480+1 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60)-1)%480+1 END
END ,CAST(a.lr_frm AS DATETIME) +'07:00'+ b.number - 1), 8),
[lr_hrs2]=CAST(CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN (480-DATEDIFF(n,'09:00',StartTime))/60.0
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60-1)%480+1)/60.0 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'18:00')/60.0 --a
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60-1)%480+1)/60.0 END
END AS DECIMAL(18,2))
FROM (SELECT *,StartTime=CAST(RTRIM([frm_hrs])+':'+RTRIM([f_hrs_s]) AS DATETIME),EndTime=CAST(RTRIM([to_hrs])+':'+RTRIM([to_hrs_s]) AS DATETIME) FROM #T ) AS a
,master.dbo.spt_values AS b
WHERE b.type = 'P'
AND b.number >= 1
AND(
CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) >= b.number AND a.StartTime<='12:00'
OR
a.StartTime>='12:00' AND CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) >= b.number
)
这是我测试的数据 已经把您给的代码中08:00和17:00替换成了09:00和18:00 刚发现没有替换之前 那个王五的时间 好像也是不对的。USE Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(22),[type] nvarchar(22),[lr_frm] Date,[frm_hrs] int,[f_hrs_s] int,[lr_to] Date,[to_hrs] int,[to_hrs_s] int,[lr_hrs] decimal(18,2))
Insert #T
select 1,N'张三',N'事假','2016-05-18',8,0,'2015-05-18',10,0,2.00 union all
select 2,N'李四',N'病假','2016-05-19',8,0,'2015-05-20',12,0,12.00 union all
select 3,N'王五',N'事假','2016-05-21',15,30,'2015-05-22',12,0,14.50 UNION ALL
select 4,N'甲',N'事假','2016-05-21',8,0,'2015-05-22',17,0,8.00 UNION ALL
select 5,N'乙',N'事假','2016-05-21',15,30,'2015-05-22',12,0,21.50 UNION ALL
select 6,N'丙',N'事假','2016-05-21',10,30,'2015-05-22',12,0,21.50
GO
SELECT a.ID ,
a.Name ,
a.type ,
CAST(CAST(a.lr_frm AS DATETIME) + b.number - 1 AS DATE) AS lr_frm ,
a.frm_hrs ,
'07:00' AS [Postdate] ,
CAST(CAST(a.lr_frm AS DATETIME)+ b.number - 1 AS DATE) AS lr_to ,
a.to_hrs ,
a.to_hrs_s ,
a.lr_hrs,
[Enddate]=CONVERT(VARCHAR(5),
DATEADD(n,
CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,'08:00',StartTime)
WHEN CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60)-1)%480+1 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60
WHEN CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60)-1)%480+1 END
END ,CAST(a.lr_frm AS DATETIME) +'07:00'+ b.number - 1), 8),
[lr_hrs2]=CAST(CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN (480-DATEDIFF(n,'08:00',StartTime))/60.0
WHEN CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60-1)%480+1)/60.0 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'17:00')/60.0
WHEN CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60-1)%480+1)/60.0 END
END AS DECIMAL(18,2))
FROM (SELECT *,StartTime=CAST(RTRIM([frm_hrs])+':'+RTRIM([f_hrs_s]) AS DATETIME),EndTime=CAST(RTRIM([to_hrs])+':'+RTRIM([to_hrs_s]) AS DATETIME) FROM #T ) AS a
,master.dbo.spt_values AS b
WHERE b.type = 'P'
AND b.number >= 1
AND(
CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) >= b.number AND a.StartTime<='12:00'
OR
a.StartTime>='12:00' AND CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) >= b.number
)
/*
ID Name type lr_frm frm_hrs Postdate lr_to to_hrs to_hrs_s lr_hrs Enddate lr_hrs2
1 张三 事假 2016-05-18 8 07:00 2016-05-18 10 0 2.00 09:00 2.00
2 李四 病假 2016-05-19 8 07:00 2016-05-19 12 0 12.00 15:00 8.00
2 李四 病假 2016-05-20 8 07:00 2016-05-20 12 0 12.00 11:00 4.00
3 王五 事假 2016-05-21 15 07:00 2016-05-21 12 0 14.50 04:00 1.50
3 王五 事假 2016-05-22 15 07:00 2016-05-22 12 0 14.50 15:00 8.00
3 王五 事假 2016-05-23 15 07:00 2016-05-23 12 0 14.50 12:00 5.00
4 甲 事假 2016-05-21 8 07:00 2016-05-21 17 0 8.00 15:00 8.00
5 乙 事假 2016-05-21 15 07:00 2016-05-21 12 0 21.50 11:00 1.50
5 乙 事假 2016-05-22 15 07:00 2016-05-22 12 0 21.50 15:00 8.00
5 乙 事假 2016-05-23 15 07:00 2016-05-23 12 0 21.50 15:00 8.00
5 乙 事假 2016-05-24 15 07:00 2016-05-24 12 0 21.50 11:00 4.00
6 丙 事假 2016-05-21 10 07:00 2016-05-21 12 0 21.50 12:30 5.50
6 丙 事假 2016-05-22 10 07:00 2016-05-22 12 0 21.50 15:00 8.00
6 丙 事假 2016-05-23 10 07:00 2016-05-23 12 0 21.50 15:00 8.00
*/
[/quote]
USE Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(22),[type] nvarchar(22),[lr_frm] Date,[frm_hrs] int,[f_hrs_s] int,[lr_to] Date,[to_hrs] int,[to_hrs_s] int,[lr_hrs] decimal(18,2))
Insert #T
select 1,N'张三',N'事假','2016-05-18',9,0,'2016-05-18',18,0,8.00 union all
select 2,N'李四',N'病假','2016-05-19',9,0,'2016-05-20',12,0,12.00 union all
select 3,N'王五',N'事假','2016-05-21',15,30,'2016-05-22',12,0,5.50 union all
select 4,N'赵六',N'病假','2016-05-10',10,30,'2016-05-11',12,0,2.50 union all
select 5,N'田七',N'婚假','2016-06-30',17,0,'2016-07-01',10,30,1.00
Go
SELECT a.ID ,
a.Name ,
a.type ,
CAST(CAST(a.lr_frm AS DATETIME) + b.number - 1 AS DATE) AS lr_frm ,
a.frm_hrs ,
'07:00' AS [Postdate] ,
CAST(CAST(a.lr_frm AS DATETIME)+ b.number - 1 AS DATE) AS lr_to ,
a.to_hrs ,
a.to_hrs_s ,
a.lr_hrs,
[Enddate]=CONVERT(VARCHAR(5),
DATEADD(n,
CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,'09:00',StartTime)
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) = b.number AND b.number=1 THEN a.[lr_hrs]*60
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60)-1)%480+1 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'18:00')
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) = b.number AND b.number=1 THEN a.[lr_hrs]*60
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60)-1)%480+1 END
END ,CAST(a.lr_frm AS DATETIME) +'07:00'+ b.number - 1), 8),
[lr_hrs2]=CAST(CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN (480-DATEDIFF(n,'09:00',StartTime))/60.0
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) = b.number AND b.number=1 THEN a.[lr_hrs]
WHEN CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60-1)%480+1)/60.0 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'18:00')/60.0
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) = b.number AND b.number=1 THEN a.[lr_hrs]
WHEN CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60-1)%480+1)/60.0 END
END AS DECIMAL(18,2))
FROM (SELECT *,StartTime=CAST(RTRIM([frm_hrs])+':'+RTRIM([f_hrs_s]) AS DATETIME),EndTime=CAST(RTRIM([to_hrs]+1)+':'+RTRIM([to_hrs_s]) AS DATETIME) FROM #T ) AS a
,master.dbo.spt_values AS b
WHERE b.type = 'P'
AND b.number >= 1
AND(
CEILING((DATEDIFF(n,'09:00',StartTime)+a.[lr_hrs]*60) / 480.0) >= b.number AND a.StartTime<='12:00'
OR
a.StartTime>='12:00' AND CEILING((480-DATEDIFF(n,StartTime,'18:00')+a.[lr_hrs]*60) / 480.0) >= b.number
)
/*
ID Name type lr_frm frm_hrs Postdate lr_to to_hrs to_hrs_s lr_hrs Enddate lr_hrs2
1 张三 事假 2016-05-18 9 07:00 2016-05-18 18 0 8.00 15:00 8.00
2 李四 病假 2016-05-19 9 07:00 2016-05-19 12 0 12.00 15:00 8.00
2 李四 病假 2016-05-20 9 07:00 2016-05-20 12 0 12.00 11:00 4.00
3 王五 事假 2016-05-21 15 07:00 2016-05-21 12 0 5.50 09:30 2.50
3 王五 事假 2016-05-22 15 07:00 2016-05-22 12 0 5.50 10:00 3.00
4 赵六 病假 2016-05-10 10 07:00 2016-05-10 12 0 2.50 09:30 2.50
5 田七 婚假 2016-06-30 17 07:00 2016-06-30 10 30 1.00 08:00 1.00
*/
USE Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(22),[type] nvarchar(22),[lr_frm] Date,[frm_hrs] int,[f_hrs_s] int,[lr_to] Date,[to_hrs] int,[to_hrs_s] int,[lr_hrs] decimal(18,2))
Insert #T
select 1,N'张三',N'事假','2016-05-18',8,0,'2015-05-18',10,0,2.00 union all
select 2,N'李四',N'病假','2016-05-19',8,0,'2015-05-20',12,0,12.00 union all
select 3,N'王五',N'事假','2016-05-21',15,30,'2015-05-22',12,0,14.50 UNION ALL
select 4,N'甲',N'事假','2016-05-21',8,0,'2015-05-22',17,0,8.00 UNION ALL
select 5,N'乙',N'事假','2016-05-21',15,30,'2015-05-22',12,0,21.50 UNION ALL
select 6,N'丙',N'事假','2016-05-21',10,30,'2015-05-22',12,0,21.50
GO
SELECT a.ID ,
a.Name ,
a.type ,
CAST(CAST(a.lr_frm AS DATETIME) + b.number - 1 AS DATE) AS lr_frm ,
a.frm_hrs ,
'07:00' AS [Postdate] ,
CAST(CAST(a.lr_frm AS DATETIME)+ b.number - 1 AS DATE) AS lr_to ,
a.to_hrs ,
a.to_hrs_s ,
a.lr_hrs,
[Enddate]=CONVERT(VARCHAR(5),
DATEADD(n,
CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,'08:00',StartTime)
WHEN CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60)-1)%480+1 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN 480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60
WHEN CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 480
ELSE ((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60)-1)%480+1 END
END ,CAST(a.lr_frm AS DATETIME) +'07:00'+ b.number - 1), 8),
[lr_hrs2]=CAST(CASE WHEN a.StartTime<='12:00'
THEN CASE WHEN CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN (480-DATEDIFF(n,'08:00',StartTime))/60.0
WHEN CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60-1)%480+1)/60.0 END
ELSE
CASE WHEN CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) > b.number AND b.number=1 THEN DATEDIFF(n,StartTime,'17:00')/60.0
WHEN CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) > b.number THEN 8
ELSE ((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60-1)%480+1)/60.0 END
END AS DECIMAL(18,2))
FROM (SELECT *,StartTime=CAST(RTRIM([frm_hrs])+':'+RTRIM([f_hrs_s]) AS DATETIME),EndTime=CAST(RTRIM([to_hrs])+':'+RTRIM([to_hrs_s]) AS DATETIME) FROM #T ) AS a
,master.dbo.spt_values AS b
WHERE b.type = 'P'
AND b.number >= 1
AND(
CEILING((DATEDIFF(n,'08:00',StartTime)+a.[lr_hrs]*60) / 480.0) >= b.number AND a.StartTime<='12:00'
OR
a.StartTime>='12:00' AND CEILING((480-DATEDIFF(n,StartTime,'17:00')+a.[lr_hrs]*60) / 480.0) >= b.number
)
/*
ID Name type lr_frm frm_hrs Postdate lr_to to_hrs to_hrs_s lr_hrs Enddate lr_hrs2
1 张三 事假 2016-05-18 8 07:00 2016-05-18 10 0 2.00 09:00 2.00
2 李四 病假 2016-05-19 8 07:00 2016-05-19 12 0 12.00 15:00 8.00
2 李四 病假 2016-05-20 8 07:00 2016-05-20 12 0 12.00 11:00 4.00
3 王五 事假 2016-05-21 15 07:00 2016-05-21 12 0 14.50 04:00 1.50
3 王五 事假 2016-05-22 15 07:00 2016-05-22 12 0 14.50 15:00 8.00
3 王五 事假 2016-05-23 15 07:00 2016-05-23 12 0 14.50 12:00 5.00
4 甲 事假 2016-05-21 8 07:00 2016-05-21 17 0 8.00 15:00 8.00
5 乙 事假 2016-05-21 15 07:00 2016-05-21 12 0 21.50 11:00 1.50
5 乙 事假 2016-05-22 15 07:00 2016-05-22 12 0 21.50 15:00 8.00
5 乙 事假 2016-05-23 15 07:00 2016-05-23 12 0 21.50 15:00 8.00
5 乙 事假 2016-05-24 15 07:00 2016-05-24 12 0 21.50 11:00 4.00
6 丙 事假 2016-05-21 10 07:00 2016-05-21 12 0 21.50 12:30 5.50
6 丙 事假 2016-05-22 10 07:00 2016-05-22 12 0 21.50 15:00 8.00
6 丙 事假 2016-05-23 10 07:00 2016-05-23 12 0 21.50 15:00 8.00
*/
use Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(22),[type] nvarchar(22),[lr_frm] Date,[frm_hrs] int,[f_hrs_s] int,[lr_to] Date,[to_hrs] int,[to_hrs_s] int,[lr_hrs] decimal(18,2))
Insert #T
select 1,N'张三',N'事假','2016-05-18',8,0,'2015-05-18',10,0,2.00 union all
select 2,N'李四',N'病假','2016-05-19',8,0,'2015-05-20',12,0,12.00 union all
select 3,N'王五',N'事假','2016-05-21',15,30,'2015-05-22',12,0,14.50
Go
SELECT a.ID ,
a.Name ,
a.type ,
CAST(CAST(a.lr_frm AS DATETIME) + b.number - 1 AS DATE) AS lr_frm ,
a.frm_hrs ,
'07:00' AS [Postdate] ,
CAST(CAST(a.lr_frm AS DATETIME)+ b.number - 1 AS DATE) AS lr_to ,
a.to_hrs ,
a.to_hrs_s ,
a.lr_hrs,
[Enddate] = CONVERT(VARCHAR(5), DATEADD(n,
CASE WHEN a.[frm_hrs]=8 AND a.[f_hrs_s]=0 THEN
CASE WHEN a.[lr_hrs]*60 / 480.0 >= b.number
THEN 480
ELSE a.[lr_hrs]*60 % 480
END
ELSE
CASE WHEN ((480-DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME)))+a.[lr_hrs]*60) / 480.0 >= b.number AND b.number=1
THEN DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME))
WHEN ((480-DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME)))+a.[lr_hrs]*60) / 480.0 >= b.number
THEN 480
ELSE ((480-DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME)))+a.[lr_hrs]*60) % 480
END
END ,
CAST(a.lr_frm AS DATETIME) +'07:00'
+ b.number - 1), 8) ,
[lr_hrs2] = CAST(CASE WHEN a.[frm_hrs]=8 AND a.[f_hrs_s]=0 THEN CASE WHEN [lr_hrs] / 8.0 >= b.number THEN 8
ELSE [lr_hrs] % 8.0
END
ELSE
CASE WHEN ((480-DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME)))+a.[lr_hrs]*60) / 480.0 >= b.number AND b.number=1
THEN DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME))/60.0
WHEN ((480-DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME)))+a.[lr_hrs]*60) / 480.0 >= b.number
THEN 8
ELSE ((480-DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME)))+a.[lr_hrs]*60) % 480.0/60.0
END
END
AS DECIMAL(18,2))
FROM #T AS a ,
master.dbo.spt_values AS b
WHERE b.type = 'P'
AND b.number >= 1
AND(
CEILING(a.[lr_hrs] / 8.0) >= b.number AND a.[frm_hrs]=8 AND a.[f_hrs_s]=0
OR
(a.[frm_hrs]!=8 OR a.[f_hrs_s]!=0 ) AND CEILING(((480-DATEDIFF(n,RTRIM(a.[frm_hrs])+':'+RTRIM(a.[f_hrs_s]),CAST('17:00' AS DATETIME)))+a.[lr_hrs]*60) / 480.0) >= b.number
)
/*
ID Name type lr_frm frm_hrs Postdate lr_to to_hrs to_hrs_s lr_hrs Enddate lr_hrs2
1 张三 事假 2016-05-18 8 07:00 2016-05-18 10 0 2.00 09:00 2.00
2 李四 病假 2016-05-19 8 07:00 2016-05-19 12 0 12.00 15:00 8.00
2 李四 病假 2016-05-20 8 07:00 2016-05-20 12 0 12.00 11:00 4.00
3 王五 事假 2016-05-21 15 07:00 2016-05-21 12 0 14.50 08:30 1.50
3 王五 事假 2016-05-22 15 07:00 2016-05-22 12 0 14.50 15:00 8.00
3 王五 事假 2016-05-23 15 07:00 2016-05-23 12 0 14.50 12:00 5.00
*/