sql >> Base de Datos >  >> RDS >> Mysql

Cálculo de la diferencia en la fila de fecha y hora entre filas en la misma tabla

Suponiendo que siempre hay un comienzo para cada pausa y un final, ¿no sería algo así más directo?

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

No estoy muy seguro de cuán grandes son los valores que salen de TO_SECONDS() para las marcas de tiempo actuales; pero si son un problema cuando se suman, si podrían cambiarse a

   , 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

Puede detectar datos "anormales" agregando lo siguiente a la lista de expresiones seleccionadas

, 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:cualquier intervalo "no cerrado" se marcará como anormal; sin una verificación inicial y final mucho más complicada y costosa de los intervalos para diferenciar "abierto" de "no válido", es probablemente lo mejor que se puede hacer. La suma utilizada para "integrityCheck" adicional igual a -1 podría insinuar un intervalo abierto, pero también podría indicar un comienzo doble erróneo.