Saya pikir Anda menginginkan logika seperti berikut, di mana Anda memeriksa apakah ada catatan penutup untuk setiap catatan pembukaan. Namun sepertinya tidak mungkin untuk mendapatkan hasil yang Anda harapkan menggunakan data yang diberikan.
DECLARE @emp_swipe_rec table (EMPLOYEE_ID int, TASK_ID int, SWIPE_TYPE char(1), SWIPE_IN_OUT_TIME datetime2);
DECLARE @Now datetime2 = '2021-03-07 16:40:00.000'; --sysdatetime();
INSERT INTO @emp_swipe_rec (EMPLOYEE_ID, TASK_ID, SWIPE_TYPE, SWIPE_IN_OUT_TIME)
VALUES
(1,1,'I','2021-03-07 08:00:00.000'),
(2,2,'I','2021-03-07 08:00:00.000'),
(1,1,'O','2021-03-07 15:00:00.000'),
(1,3,'I','2021-03-07 16:00:00.000');
SELECT I.EMPLOYEE_ID, I.TASK_ID
, DATEDIFF(MINUTE, I.SWIPE_IN_OUT_TIME, @Now) AS TimeSpent
FROM @emp_swipe_rec I
WHERE SWIPE_TYPE = 'I'
-- Rule out any where a closing record in the future exists
AND NOT EXISTS (
SELECT 1
FROM @emp_swipe_rec O
WHERE O.EMPLOYEE_ID = I.EMPLOYEE_ID
AND O.TASK_ID = I.TASK_ID
AND SWIPE_TYPE = 'O'
AND O.SWIPE_IN_OUT_TIME > I.SWIPE_IN_OUT_TIME
);
Mengembalikan yang berikut menggunakan stempel waktu yang memberikan 40 menit - tetapi tidak yakin bagaimana Anda mendapatkan 130 menit:
ID_KARYAWAN | TASK_ID | Waktu yang Dihabiskan |
---|---|---|
2 | 2 | 520 |
1 | 3 | 40 |
Harap diperhatikan untuk referensi di masa mendatang, jika Anda memberikan contoh data dengan cara ini (DDL+DML), Anda tidak hanya membuat pertanyaan Anda lebih jelas, tetapi juga memudahkan orang untuk menjawab