34,588
社区成员
发帖
与我相关
我的任务
分享
use Tempdb
go
--> --> 听雨停了-->生成测试数据
if not object_id(N'Tempdb..#tabA') is null
drop table #tabA
Go
Create table #tabA([1] int,[USERID] int,[Atte_Time] Datetime)
Insert #tabA
select 2,10890895,'2018-01-10 06:30:00.000' union all
select 3,10890895,'2018-01-10 16:43:46.000' union all
select 4,10890895,'2018-01-10 20:00:14.000' union all
select 6,10890895,'2018-01-11 06:00:49.000' union all
select 7,10890895,'2018-01-12 07:00:34.000' union all
select 8,10890895,'2018-01-11 19:00:34.000' union all
select 9,10890895,'2018-01-14 06:18:14.000' union all
select 10,10890895,'2018-01-14 16:18:14.000'
Go
--Select * from #tabA
if not object_id(N'Tempdb..#tabB') is null
drop table #tabB
Go
Create table #tabB([1] int,[USERID] int,[name] nvarchar(22))
Insert #tabB
select 2,10890895,N'张三' union all
select 3,222222,N'李四'
Go
--Select * from #tabB
if not object_id(N'Tempdb..#tabC') is null
drop table #tabC
Go
Create table #tabC([1] int,[USERID] int,[SDATE] Datetime,[enddate] Datetime)
Insert #tabC
select 2,10890895,'2018-01-12 12:30:00.000','2018-01-13 17:00:00.000'
Go
--Select * from #tabC
--测试数据结束
DECLARE @begindt DATE,
@enddt DATE
SET @begindt='2018-01-10'
SET @enddt='2018-01-14'
IF OBJECT_ID('tempdb..#tabD') IS NOT NULL
DROP TABLE #tabD
SELECT dateadd(day,number,@begindt) AS dt
INTO #tabD
FROM [master]..spt_values
WHERE TYPE='p' AND number<=DATEDIFF(DAY,@begindt,@enddt)
;WITH cte AS (
SELECT * FROM #tabB,#tabD
)
,cte2 AS (
SELECT DISTINCT b.*,
MIN([Atte_Time]) OVER(PARTITION BY a.userid,CAST([Atte_Time] AS DATE)) AS mintime ,
MAX([Atte_Time]) OVER(PARTITION BY a.userid,CAST([Atte_Time] AS DATE)) AS maxtime
FROM #tabA a
RIGHT JOIN cte b ON a.USERID=b.USERID AND cast(a.Atte_Time AS date)=b.dt
)
SELECT a.name,
a.dt,
'08:00' AS up_time,
'17:00' AS down_tiime,
CONVERT(VARCHAR(100), a.mintime, 24) AS mindt,
CONVERT(VARCHAR(100), a.maxtime, 24) AS maxdt,
CASE WHEN ISNULL(c.SDATE,'')<>'' AND ISNULL(a.mintime,'')<>''
THEN CAST(DATEDIFF(minute,a.mintime,c.SDATE) AS float)/60 --当天打卡了,也请假了
WHEN ISNULL(c.SDATE,'')<>'' AND ISNULL(a.mintime,'')=''
THEN 0 --当天没打卡,但请假了
WHEN ISNULL(c.SDATE,'')='' AND ISNULL(a.mintime,'')=''
THEN 0 --当天没打卡,也没请假
WHEN ISNULL(c.SDATE,'')='' AND ISNULL(a.mintime,'')<>''
THEN CAST(DATEDIFF(minute,a.mintime,a.maxtime) AS float)/60 --当天打卡了,但没请假
END AS work_hrs,
CASE WHEN ISNULL(a.mintime,'')='' AND ISNULL(c.SDATE,'')=''
THEN NULL --当天没打卡,也没请假
WHEN ISNULL(a.mintime,'')='' AND ISNULL(c.SDATE,'')<>''
THEN 9 --当天没打卡,但是有请假
WHEN ISNULL(a.mintime,'')<>'' AND ISNULL(c.SDATE,'')<>''
THEN 9-CAST(DATEDIFF(minute,a.mintime,c.SDATE) AS float)/60 --当天打卡了,也请假了
END AS leave_hrs
FROM cte2 a
LEFT JOIN #tabC c
ON a.USERID = c.USERID
AND CAST(a.dt AS DATE) BETWEEN CAST(c.SDATE AS DATE) AND CAST(c.enddate AS DATE)