Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để chỉ chọn những người dùng vuốt vào từ bảng có tất cả các bản ghi vuốt

Tôi nghĩ bạn muốn logic như sau, nơi bạn kiểm tra xem có tồn tại một bản ghi đóng cho mọi bản ghi mở hay không. Tuy nhiên, có vẻ như không thể nhận được kết quả mong đợi của bạn bằng cách sử dụng dữ liệu được cung cấp.

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
);

Trả về phần sau bằng cách sử dụng dấu thời gian cho 40 phút - nhưng không chắc bạn đã nghĩ ra 130 phút như thế nào:

EMPLOYEE_ID TASK_ID TimeSpent
2 2 520
1 3 40

Xin lưu ý để tham khảo trong tương lai, nếu bạn cung cấp cho bạn dữ liệu mẫu theo cách này (DDL + DML), bạn không chỉ làm cho câu hỏi của mình rõ ràng hơn mà còn giúp mọi người trả lời dễ dàng hơn nhiều




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn liệt kê số lượng bản ghi trong mỗi bảng trong cơ sở dữ liệu

  2. Khóa chính tự động tăng dần trong SQL Server Management Studio 2012

  3. Chức năng so với Thủ tục được lưu trữ

  4. Tôi có thể thêm một cột không rỗng mà không có giá trị DEFAULT không

  5. SQL Server - Sao chép giao dịch (chỉ một phần dữ liệu)