27,579
社区成员
发帖
与我相关
我的任务
分享
/*SQL Server 2012 +*/
select year(sdate) as yr,month(sdate) as m,sno,sname,sum(d) as days,正式 from (
select * ,case when sum(c.d)over(partition by sno order by sdate) >10 then 1 else 0 end 正式
from #tmp_1 as t
cross apply(values(case when (datediff(hour,checkin,checkout)+24)%24>=8 then 1 else 0 end))c(d)
) as t
group by sno,sname,year(sdate),month(sdate),正式
/*低于2012*/
select year(sdate) as yr,month(sdate) as m,sno,sname,sum(d) as days,正式 from (
select * ,case when o.worked>10 then 1 else 0 end 正式
from #tmp_1 as t
cross apply(values(case when (datediff(hour,checkin,checkout)+24)%24>=8 then 1 else 0 end))c(d)
outer apply(select sum(case when (datediff(hour,tt.checkin,tt.checkout)+24)%24>=8 then 1 else 0 end) from #tmp_1 as tt where tt.sno=t.sno and datediff(d,tt.sdate,t.sdate)>=0) o(worked)
) as t
group by sno,sname,year(sdate),month(sdate),正式
+------+---+------+-------+------+----+
| yr | m | sno | sname | days | 正式 |
+------+---+------+-------+------+----+
| 2017 | 8 | 1906 | 王海 | 5 | 0 |
| 2017 | 9 | 1906 | 王海 | 3 | 0 |
| 2017 | 8 | 1913 | 游一秀 | 6 | 0 |
| 2017 | 9 | 1913 | 游一秀 | 3 | 0 |
| 2017 | 8 | 1962 | 梅青青 | 7 | 0 |
| 2017 | 9 | 1962 | 梅青青 | 3 | 0 |
| 2017 | 9 | 1962 | 梅青青 | 2 | 1 |
+------+---+------+-------+------+----+
select year(sdate) as yr,month(sdate) as m,sno,sname,sum(case when (datediff(hour,checkin,checkout)+24)%24>=8 then 1 else 0 end)
from #tmp_1
group by sno,sname,year(sdate),month(sdate)
yr m sno sname (No column name)
1 2017 8 1906 王海 5
2 2017 9 1906 王海 3
3 2017 8 1913 游一秀 6
4 2017 9 1913 游一秀 3
5 2017 8 1962 梅青青 7
6 2017 9 1962 梅青青 5
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([日期] Date,[星期] int,[工号] BIGINT,[姓名] nvarchar(23),[入职日期] Date,[上班时间] TIME,[下班时间] TIME,[签到时间] TIME,[签退时间] TIME)
Insert #T
select '2017-8-25',5,'1962',N'梅青青','2017-8-25','20:00','5:00','19:35','8:00' union all
select '2017-8-26',6,'1962',N'梅青青','2017-8-25','20:00','5:00','19:40','8:01' union all
select '2017-8-27',7,'1962',N'梅青青','2017-8-25','20:00','5:00','19:41','8:00' union all
select '2017-8-28',1,'1962',N'梅青青','2017-8-25','20:00','5:00','19:47','8:00' union all
select '2017-8-29',2,'1962',N'梅青青','2017-8-25','20:00','5:00','19:47','8:01' union all
select '2017-8-30',3,'1962',N'梅青青','2017-8-25','20:00','5:00','19:42','8:01' union all
select '2017-8-31',4,'1962',N'梅青青','2017-8-25','20:00','5:00','19:43','8:00' union all
select '2017-9-1',5,'1962',N'梅青青','2017-8-25','20:00','5:00','19:47','8:02' union all
select '2017-9-2',6,'1962',N'梅青青','2017-8-25','20:00','5:00','19:44','8:01' union all
select '2017-9-3',7,'1962',N'梅青青','2017-8-25','20:00','5:00','19:42','8:00' union all
select '2017-9-4',1,'1962',N'梅青青','2017-8-25','20:00','5:00','19:42','8:00' union all
select '2017-9-5',2,'1962',N'梅青青','2017-8-25','20:00','5:00','19:45','8:00' union all
select '2017-8-25',5,'1906',N'王海','2017-8-25','8:30','17:30',null,null union all
select '2017-8-26',6,'1906',N'王海','2017-8-25','8:30','17:30','8:19','18:06' union all
select '2017-8-27',7,'1906',N'王海','2017-8-25','8:30','17:30',null,null union all
select '2017-8-28',1,'1906',N'王海','2017-8-25','8:30','17:30','8:17','23:15' union all
select '2017-8-29',2,'1906',N'王海','2017-8-25','8:30','17:30','8:15','21:05' union all
select '2017-8-30',3,'1906',N'王海','2017-8-25','8:30','17:30','7:57','20:04' union all
select '2017-8-31',4,'1906',N'王海','2017-8-25','8:30','17:30','8:17','19:53' union all
select '2017-9-1',5,'1906',N'王海','2017-8-25','8:30','17:30','8:22','17:32' union all
select '2017-9-2',6,'1906',N'王海','2017-8-25','8:30','17:30',null,null union all
select '2017-9-3',7,'1906',N'王海','2017-8-25','8:30','17:30',null,null union all
select '2017-9-4',1,'1906',N'王海','2017-8-25','8:30','17:30','8:21','20:01' union all
select '2017-9-5',2,'1906',N'王海','2017-8-25','8:30','17:30','8:20','19:02' union all
select '2017-8-25',5,'1913',N'游一秀','2017-8-25','8:30','17:30',null,null union all
select '2017-8-26',6,'1913',N'游一秀','2017-8-25','8:30','17:30','7:48','20:00' union all
select '2017-8-27',7,'1913',N'游一秀','2017-8-25','8:30','17:30','7:50','20:00' union all
select '2017-8-28',1,'1913',N'游一秀','2017-8-25','8:30','17:30','7:47','20:23' union all
select '2017-8-29',2,'1913',N'游一秀','2017-8-25','8:30','17:30','7:49','20:01' union all
select '2017-8-30',3,'1913',N'游一秀','2017-8-25','8:30','17:30','7:51','20:02' union all
select '2017-8-31',4,'1913',N'游一秀','2017-8-25','8:30','17:30','7:48','20:01' union all
select '2017-9-1',5,'1913',N'游一秀','2017-8-25','8:30','17:30','7:53','20:03' union all
select '2017-9-2',6,'1913',N'游一秀','2017-8-25','8:30','17:30','7:50','20:00' union all
select '2017-9-3',7,'1913',N'游一秀','2017-8-25','8:30','17:30',null,null union all
select '2017-9-4',1,'1913',N'游一秀','2017-8-25','8:30','17:30','7:44','20:01' union all
select '2017-9-5',2,'1913',N'游一秀','2017-8-25','8:30','17:30','7:47','20:00'
Go
--测试数据结束
SELECT CONVERT(VARCHAR(7), 日期) AS 日期 ,
工号 ,
姓名 ,
SUM(CASE WHEN 签到时间 < 签退时间
AND DATEDIFF(HOUR, 签到时间, 签退时间) >= 8 THEN 1
WHEN 签到时间 > 签退时间
AND DATEDIFF(HOUR, 签退时间, 签到时间) <= 16 THEN 1
ELSE 0
END) AS 天数
FROM #T
WHERE 签到时间 IS NOT NULL
AND 签退时间 IS NOT NULL
AND 签到时间 < 上班时间
AND 签退时间 > 下班时间
GROUP BY CONVERT(VARCHAR(7), 日期) ,
工号 ,
姓名
IF OBJECT_ID('tempdb..#tmp_1') IS NOT NULL DROP TABLE #tmp_1
CREATE TABLE #tmp_1 (
sdate DATETIME,
weekday INT,
sno INT,
sname VARCHAR(20),
entrydate DATETIME,
officehours VARCHAR(10),
offhours VARCHAR(10),
checkin VARCHAR(10),
checkout VARCHAR(10)
)
INSERT INTO #tmp_1
select '2017/8/25','5','1962','梅青青','2017/8/25','20:00','5:00','19:35','8:00' union all
select '2017/8/26','6','1962','梅青青','2017/8/25','20:00','5:00','19:40','8:01' union all
select '2017/8/27','7','1962','梅青青','2017/8/25','20:00','5:00','19:41','8:00' union all
select '2017/8/28','1','1962','梅青青','2017/8/25','20:00','5:00','19:47','8:00' union all
select '2017/8/29','2','1962','梅青青','2017/8/25','20:00','5:00','19:47','8:01' union all
select '2017/8/30','3','1962','梅青青','2017/8/25','20:00','5:00','19:42','8:01' union all
select '2017/8/31','4','1962','梅青青','2017/8/25','20:00','5:00','19:43','8:00' union all
select '2017/9/1','5','1962','梅青青','2017/8/25','20:00','5:00','19:47','8:02' union all
select '2017/9/2','6','1962','梅青青','2017/8/25','20:00','5:00','19:44','8:01' union all
select '2017/9/3','7','1962','梅青青','2017/8/25','20:00','5:00','19:42','8:00' union all
select '2017/9/4','1','1962','梅青青','2017/8/25','20:00','5:00','19:42','8:00' union all
select '2017/9/5','2','1962','梅青青','2017/8/25','20:00','5:00','19:45','8:00' union all
select '2017/8/25','5','1906','王海','2017/8/25','8:30','17:30','','' union all
select '2017/8/26','6','1906','王海','2017/8/25','8:30','17:30','8:19','18:06' union all
select '2017/8/27','7','1906','王海','2017/8/25','8:30','17:30','','' union all
select '2017/8/28','1','1906','王海','2017/8/25','8:30','17:30','8:17','23:15' union all
select '2017/8/29','2','1906','王海','2017/8/25','8:30','17:30','8:15','21:05' union all
select '2017/8/30','3','1906','王海','2017/8/25','8:30','17:30','7:57','20:04' union all
select '2017/8/31','4','1906','王海','2017/8/25','8:30','17:30','8:17','19:53' union all
select '2017/9/1','5','1906','王海','2017/8/25','8:30','17:30','8:22','17:32' union all
select '2017/9/2','6','1906','王海','2017/8/25','8:30','17:30','','' union all
select '2017/9/3','7','1906','王海','2017/8/25','8:30','17:30','','' union all
select '2017/9/4','1','1906','王海','2017/8/25','8:30','17:30','8:21','20:01' union all
select '2017/9/5','2','1906','王海','2017/8/25','8:30','17:30','8:20','19:02' union all
select '2017/8/25','5','1913','游一秀','2017/8/25','8:30','17:30','','' union all
select '2017/8/26','6','1913','游一秀','2017/8/25','8:30','17:30','7:48','20:00' union all
select '2017/8/27','7','1913','游一秀','2017/8/25','8:30','17:30','7:50','20:00' union all
select '2017/8/28','1','1913','游一秀','2017/8/25','8:30','17:30','7:47','20:23' union all
select '2017/8/29','2','1913','游一秀','2017/8/25','8:30','17:30','7:49','20:01' union all
select '2017/8/30','3','1913','游一秀','2017/8/25','8:30','17:30','7:51','20:02' union all
select '2017/8/31','4','1913','游一秀','2017/8/25','8:30','17:30','7:48','20:01' union all
select '2017/9/1','5','1913','游一秀','2017/8/25','8:30','17:30','7:53','20:03' union all
select '2017/9/2','6','1913','游一秀','2017/8/25','8:30','17:30','7:50','20:00' union all
select '2017/9/3','7','1913','游一秀','2017/8/25','8:30','17:30','','' union all
select '2017/9/4','1','1913','游一秀','2017/8/25','8:30','17:30','7:44','20:01' union all
select '2017/9/5','2','1913','游一秀','2017/8/25','8:30','17:30','7:47','14:00'
;WITH a AS (
SELECT
CASE WHEN ISNULL(officehours,'')='' THEN NULL ELSE CAST(CONVERT(CHAR(10),sdate,120)+' '+officehours AS DATETIME) END AS officehours
,CASE WHEN ISNULL(offhours,'')='' THEN NULL ELSE CAST(CONVERT(CHAR(10),sdate,120)+' '+offhours AS DATETIME) END AS offhours
,CASE WHEN ISNULL(checkin,'')='' THEN NULL ELSE CAST(CONVERT(CHAR(10),sdate,120)+' '+CASE WHEN officehours>checkin THEN officehours ELSE checkin END AS DATETIME) END AS checkin
,CASE WHEN ISNULL(checkout,'')='' THEN NULL ELSE CAST(CONVERT(CHAR(10),sdate,120)+' '+CASE WHEN offhours<checkout THEN offhours ELSE checkout END AS DATETIME) END AS checkout
,weekday,sno,sname,entrydate
FROM #tmp_1
)
,b AS (
SELECT IIF(DATEDIFF(hh,officehours,offhours)>0,DATEDIFF(hh,checkin,checkout),DATEDIFF(hh,checkin,dateadd(dd,1,checkout))) AS workhours,*
FROM a
)
SELECT sname,CONVERT(CHAR(7),officehours,120) AS year_month,COUNT(*) AS days FROM b
WHERE ISNULL(workhours,0) >8
GROUP BY sname,CONVERT(CHAR(7),officehours,120)
ORDER BY sname,CONVERT(CHAR(7),officehours,120)
sname year_month days
-------------------- ---------- -----------
梅青青 2017-08 7
梅青青 2017-09 5
王海 2017-08 5
王海 2017-09 3
游一秀 2017-08 6
游一秀 2017-09 3
LZ试试