Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Calculando a diferença na linha de data e hora entre as linhas da mesma tabela


Assumindo que há sempre um começo para cada pausa e fim, algo assim não seria mais direto?
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

Não tenho certeza de quão grandes são os valores que saem de TO_SECONDS() para os timestamps atuais; mas se eles são um problema ao serem somados, se podem ser alterados para
   , 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

Você pode detectar dados "anormais" adicionando o seguinte à lista de expressões selecionadas
, 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:quaisquer intervalos "não fechados" serão marcados como anormais; sem uma verificação inicial e final muito mais complicada e cara de intervalos para diferenciar "aberto" de "inválido", provavelmente é o melhor que pode ser feito. A soma usada para "integrityCheck" adicional igual a -1 pode sugerir um intervalo aberto, mas também pode indicar uma partida dupla errônea.