sql >> データベース >  >> RDS >> Sqlserver

すべてのスワイプレコードを持つテーブルからスワイプインユーザーのみを選択する方法

    次のようなロジックが必要だと思います。ここでは、開始レコードごとに終了レコードが存在するかどうかを確認します。ただし、提供されたデータを使用して期待どおりの結果を得ることができないようです。

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

    40 分を与えるタイムスタンプを使用して次を返しますが、130 分をどのように考え出したかは不明です:

    今後の参考のために、この方法 (DDL+DML) でサンプル データを提供すると、質問が明確になるだけでなく、人々が回答しやすくなることに注意してください。




    1. 2つの列を一致させる

    2. MySQLがMacOSXのどこにインストールされているかを調べます

    3. すべての子カテゴリを取得する再帰関数

    4. SQL Server 2008 での電子メール検証?

    EMPLOYEE_ID TASK_ID 滞在時間
    2 2 520
    1 3 40