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

同じテーブルの行間の日時行の差を計算する

    一時停止と終了ごとに常に開始があると仮定すると、このようなものはより直接的ではないでしょうか?

    SELECT t.task
       , SUM(TO_SECONDS(t.stime) 
             * CASE WHEN t.status IN (1) THEN -1
                    WHEN t.status IN (2, 3) THEN 1
                    ELSE 0
               END
         ) AS totalTimeSecs
    FROM tblwork AS task
    GROUP BY t.task
    

    TO_SECONDS()から出力される値が、現在のタイムスタンプに対してどれほど大きいかはよくわかりません。ただし、合計時に問題が発生する場合は、

    に変更できます。
       , SUM((TO_SECONDS(t.stime) - some_constant_just_before_or_at_your_earliest_seconds)
             * CASE WHEN t.status IN (1) THEN -1
                    WHEN t.status IN (2, 3) THEN 1
                    ELSE 0
               END
         ) AS totalTimeSecs
    

    選択式リストに以下を追加することで、「異常な」データを検出できます

    , CASE WHEN SUM(CASE 
                    WHEN t.status IN (1) THEN -1 
                    WHEN t.status IN (2, 3) THEN 1 
                    ELSE 0 END
                  ) = 0 
           THEN 'OK' 
           ELSE 'ABNORMAL' 
       END AS integrityCheck
    

    注:「閉じられていない」間隔は異常としてマークされます。 「オープン」と「無効」を区別するための間隔の開始と終了のチェッ​​クがはるかに複雑で費用がかかることなく、実行できる最善の方法です。 -1に等しい追加の「integrityCheck」に使用される合計は、オープンエンドの間隔を示唆している可能性がありますが、誤ったダブルスタートを示している可能性もあります。




    1. SQL Server2014/2016OLTPワークロードの実用的なプロセッサの選択

    2. SET NULL:SQLcl / SQL*PlusでNULL値が発生した場合に返される文字列を指定します

    3. データベース内のすべてのテーブルのサイズを取得する

    4. MySQLのselectステートメントで条件をどのように記述しますか?