sql >> Database >  >> RDS >> Mysql

Het verschil berekenen op datetime-rij tussen rijen in dezelfde tabel

Ervan uitgaande dat er altijd een begin is voor elke pauze en einde, zou zoiets dan niet directer zijn?

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

Ik ben er niet helemaal zeker van hoe groot de waarden die uit TO_SECONDS() komen voor huidige tijdstempels zijn; maar als ze een probleem vormen bij het optellen, kan dit worden gewijzigd 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

U kunt "abnormale" gegevens detecteren door het volgende toe te voegen aan de lijst met geselecteerde uitdrukkingen

, 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

Opmerking:alle "niet-afgesloten" intervallen worden als abnormaal gemarkeerd; zonder veel ingewikkelder en duurdere begin- en eindcontrole op intervallen om onderscheid te maken tussen "open" en "ongeldig", is dit waarschijnlijk het beste dat kan worden gedaan. De som die wordt gebruikt voor aanvullende "integrityCheck" gelijk aan -1 kan duiden op een interval met een open einde, maar kan ook duiden op een foutieve dubbele start.




  1. Flask_SQLAlchemy, MySQL, Zweedse karakters opslaan å, ä, ö?

  2. Moeilijkheden bij het installeren van mysql gem op Ubuntu

  3. MySQL haalt string(s) op tussen twee # / meerdere paren van #

  4. Leeftijd berekenen in MySQL (InnoDb)