Mysql
 sql >> Database >  >> RDS >> Mysql

Calcolo della differenza sulla riga datetime tra le righe della stessa tabella

Supponendo che ci sia sempre un inizio per ogni pausa e fine, qualcosa del genere non sarebbe più diretto?

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

Non sono del tutto sicuro di quanto siano grandi i valori che escono da TO_SECONDS() per i timestamp correnti; ma se sono un problema durante la somma, se potrebbero essere cambiati in

   , 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

Puoi rilevare dati "anormali" aggiungendo quanto segue all'elenco delle espressioni selezionate

, 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

Nota:eventuali intervalli "non chiusi" verranno contrassegnati come anormali; senza molto più complicato e costoso controllo di inizio e fine degli intervalli per differenziare "aperto" da "non valido", è probabilmente il meglio che si può fare. La somma utilizzata per "integrityCheck" aggiuntivo pari a -1 potrebbe suggerire un intervallo a tempo indeterminato, ma potrebbe anche indicare un doppio inizio errato.