請教各位大大SQL 語法
如果我要知道當天什麼人在勤中,
要查八個小時內有上班記錄確沒有下班記錄的人
SELECT
[empno] as 員工編號
,[empcname] as 員工姓名
,[atname] as 刷卡狀況1
,[atype] as 刷卡狀況2
,[datetime] as 刷卡時間
FROM [cardData]
where [recorddatetime]>dateadd(hh,-8,getdate())
資料庫格式如下
empno empcname atname atype datetime
00001 小李 上班 1 2019-07-01 07:15:22.000
00002 小志 上班 1 2019-07-01 07:14:16.000
00003 小陳 上班 1 2019-07-01 07:10:46.000
00004 小融 上班 1 2019-07-01 07:11:49.000
11111 小翁 上班 1 2019-07-01 07:13:33.000
11111 小翁 上班 1 2019-07-01 07:13:34.000
00005 小吳 上班 1 2019-07-01 07:10:55.000
00007 小融 上班 1 2019-07-01 07:11:49.000
00003 小陳 下班 2 2019-07-01 10:10:46.000
00004 小融 下班 2 2019-07-01 12:11:49.000
00002 小志 下班 2 2019-07-01 13:14:16.000
00001 小李 下班 2 2019-07-01 17:18:16.000
希望可以用SQL運算出,當下的八小時前到現在有刷上班但是沒有刷下班的人員資料
可以知道現在有什麼人還未下班,以上,感謝
可以藉由group by 每日資料 + 上班 join 下班資料
假如沒有下班的員工顯示在查詢結果內
with cte as (
select [empno], [empcname], [atname], [atype], convert(date,datetime) [date],min(datetime) mintime
from cardData
group by [empno], [empcname], [atname], [atype], convert(date,datetime)
)
select T1.empno,T1.empcname,T1.atname,T1.atype,T1.date 日期,T1.mintime 最早刷卡時間
from (
select * from cte
where atype = 1
) T1
left join (
select * from cte
where atype = 2
) T2 on T1.empno = T2.empno and T1.[date] = T2.[date]
where T2.empno is null
我也玩一下...
declare @cardData table(
empno nvarchar(50)
,empcname nvarchar(50)
,atname nvarchar(50)
,atype int
,recorddatetime datetime
)
insert into @cardData
values('00001','小李','上班',1,'2019-07-01 07:15:22.000')
,('00002','小志','上班',1,'2019-07-01 07:14:16.000')
,('00003','小陳','上班',1,'2019-07-01 07:10:46.000')
,('00004','小融','上班',1,'2019-07-01 07:11:49.000')
,('11111','小翁','上班',1,'2019-07-01 07:13:33.000')
,('11111','小翁','上班',1,'2019-07-01 07:13:34.000')
,('00005','小吳','上班',1,'2019-07-01 07:10:55.000')
,('00007','小融','上班',1,'2019-07-01 07:11:49.000')
,('00003','小陳','下班',2,'2019-07-01 10:10:46.000')
,('00004','小融','下班',2,'2019-07-01 12:11:49.000')
,('00002','小志','下班',2,'2019-07-01 13:14:16.000')
,('00001','小李','下班',2,'2019-07-01 17:18:16.000')
select a.empno
,a.empcname
,min(a.recorddatetime) recorddatetime
from @cardData a
left join @cardData b on a.empno = b.empno
group by a.empno
,a.empcname
having max(a.atype) = min(b.atype)
加一筆資料試試 :
('00005','小吳','下班',2,'2019-06-01 17:18:16.000')
rogeryao
恩?這樣小吳就不會秀出來了吧@@~
這SQL來就是單純判斷他給的區間
假設他的區間拉到1個月~就會有6月份的資料~
所以我先假定他查詢出來的資料都是~在他8小時內的資料~