Mam tabelę z wejściami i wyjściami pracowników.
Wygląda to tak:
2019-04-01 0501 WEJ
2019-04-01 1105 WYJ
2019-04-01 1312 WEJ
2019-04-01 1444 WYJ
Czy da się jakoś zapytaniem wyliczyć czas pracy?
Mam tabelę z wejściami i wyjściami pracowników.
Wygląda to tak:
2019-04-01 0501 WEJ
2019-04-01 1105 WYJ
2019-04-01 1312 WEJ
2019-04-01 1444 WYJ
Czy da się jakoś zapytaniem wyliczyć czas pracy?
Da się, jak użyjesz np. TIMESTAMPDIFF na odpowiednich rekordach :) Tylko spasowanie odpowiednich rekordów może być kłopotliwe. Ale masz różne opcje:
# Czasy pracy per wejście/wyjście
SELECT WORKER_ID, TIMESTAMPDIFF(HOUR, ARRIVAL_DT, DEPARTURE_DT) AS UPTIME FROM MY_TABLE;
# Sumaryczny czas pracy
SELECT WORKER_ID, SUM(TIMESTAMPDIFF(HOUR, ARRIVAL_DT, DEPARTURE_DT)) AS TOTAL_UPTIME FROM MY_TABLE GROUP BY WORKER_ID;
Tak na szybko: http://sqlfiddle.com/#!18/a615a/7/0
Oczywiście wszystko zależy od jakości danych. W tym zapytaniu mamy założenie, że zdarzenia WEJ/WYJ następują jedno po drugim.
Zakladajac ze nie bedzie brakujacych danych tzn dla kazdego wejscia bedzie wyjscie.
http://sqlfiddle.com/#!18/5878a/2
DECLARE @user_clocking_records TABLE
(
empid INT ,
dt DATETIME ,
event CHAR(3)
);
INSERT INTO @user_clocking_records
VALUES ( 1, '2019-04-01 05:59:01', 'WEJ' ) ,
( 1, '2019-04-01 11:06:05', 'WYJ' ) ,
( 1, '2019-04-01 13:11:12', 'WEJ' ) ,
( 1, '2019-04-01 14:56:44', 'WYJ' ) ,
( 2, '2019-04-01 05:59:01', 'WEJ' ) ,
( 2, '2019-04-01 14:58:44', 'WYJ' ) ,
( 1, '2019-04-02 05:59:01', 'WEJ' ) ,
( 1, '2019-04-02 12:58:44', 'WYJ' );
SELECT day ,
a.empid ,
SUM(DATEDIFF(MINUTE, a.wej, a.wyj)) min
FROM ( SELECT empid ,
CONVERT(DATE, dt, 111) day ,
event ,
dt wej ,
LEAD(dt) OVER ( ORDER BY empid ,
dt ) wyj
FROM @user_clocking_records ) a
WHERE a.event = 'WEJ'
GROUP BY day ,
a.empid
ORDER BY a.day ,
a.empid;
ipsd: Dzięki, rewelacja.