iT邦幫忙

0

SQL 語法要知道當天什麼人在勤中人員姓名

請教各位大大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運算出,當下的八小時前到現在有刷上班但是沒有刷下班的人員資料
可以知道現在有什麼人還未下班,以上,感謝

firecold iT邦新手 4 級 ‧ 2019-07-02 12:23:09 檢舉
有個小問題,假設要算當下,那應該就直接抓沒有下班紀錄就可以
還有 empno 到底是不是user_id 是的話小融為什麼不一樣呢
gnnuppke iT邦新手 5 級 ‧ 2019-07-05 20:12:00 檢舉
拍謝~~00004的小融跟00007的小融是不同人~~因為不知道所有人的班表狀況,所以我知道依有上班的人~才知道他有出勤~~

2 個回答

5
暐翰
iT邦大師 1 級 ‧ 2019-07-01 13:42:05

可以藉由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

20190701134115.png


線上測試連結

2
純真的人
iT邦高手 1 級 ‧ 2019-07-01 23:40:24

我也玩一下...

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)

https://ithelp.ithome.com.tw/upload/images/20190701/20061369GRYk6S2hP4.png

rogeryao iT邦高手 6 級 ‧ 2019-07-02 11:23:43 檢舉

加一筆資料試試 :
('00005','小吳','下班',2,'2019-06-01 17:18:16.000')

rogeryao
恩?這樣小吳就不會秀出來了吧@@~
這SQL來就是單純判斷他給的區間
假設他的區間拉到1個月~就會有6月份的資料~

所以我先假定他查詢出來的資料都是~在他8小時內的資料~

我要發表回答

立即登入回答