Mysql
 sql >> Base de données >  >> RDS >> Mysql

Calcul de la différence sur la ligne datetime entre les lignes de la même table

En supposant qu'il y ait toujours un début pour chaque pause et chaque fin, quelque chose comme ça ne serait-il pas plus direct ?

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

Je ne suis pas tout à fait sûr de la taille des valeurs qui sortent de TO_SECONDS() pour les horodatages actuels ; mais s'ils posent problème lors de la sommation, ils peuvent être remplacés par

   , 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

Vous pouvez détecter des données "anormales" en ajoutant ce qui suit à la liste d'expressions sélectionnées

, 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

Remarque :tout intervalle "non fermé" sera marqué comme anormal ; sans vérification de début et de fin beaucoup plus compliquée et coûteuse des intervalles pour différencier "ouvert" de "invalide", c'est probablement le mieux que l'on puisse faire. La somme utilisée pour un "integrityCheck" supplémentaire égal à -1 peut suggérer un intervalle ouvert, mais peut également indiquer un double départ erroné.