Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Berechnen der Differenz in der Datetime-Zeile zwischen Zeilen in derselben Tabelle

Angenommen, es gibt immer einen Anfang für jede Pause und jedes Ende, wäre so etwas nicht direkter?

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

Ich bin mir nicht ganz sicher, wie groß die Werte, die aus TO_SECONDS() kommen, für aktuelle Zeitstempel sind; aber wenn sie bei der Summierung ein Problem darstellen, könnte if in

geändert werden
   , 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

Sie können "anormale" Daten erkennen, indem Sie Folgendes zur Liste der ausgewählten Ausdrücke hinzufügen

, 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

Hinweis:Alle „nicht geschlossenen“ Intervalle werden als anormal markiert; Ohne viel kompliziertere und teurere Start- und Endprüfung auf Intervalle, um "offen" von "ungültig" zu unterscheiden, ist dies wahrscheinlich das Beste, was getan werden kann. Die für den zusätzlichen "integrityCheck" verwendete Summe von -1 könnte auf ein offenes Intervall hindeuten, könnte aber auch auf einen fehlerhaften Doppelstart hindeuten.