sql >> Databasteknik >  >> RDS >> Mysql

Beräknar skillnaden på datum och tid rad mellan rader i samma tabell

Om man antar att det alltid finns en början för varje paus och slut, skulle inte något sådant här vara mer direkt?

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

Jag är inte helt säker direkt hur stora värdena som kommer ut från TO_SECONDS() är för aktuella tidsstämplar; men om de är ett problem när de summeras, kan om ändras till

   , 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

Du kan upptäcka "onormala" data genom att lägga till följande i listan med utvalda uttryck

, 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

Obs:alla "oslutna" intervall kommer att markeras som onormala; utan mycket mer komplicerad och dyrbar start- och slutkontroll efter intervaller för att skilja "öppen" från "ogiltig" är det nog det bästa som kan göras. Summan som används för ytterligare "integrityCheck" som är lika med -1 kan antyda ett öppet intervall, men kan också indikera en felaktig dubbelstart.




  1. Databasinsättningsprestanda

  2. Hur kan jag utfärda ett enstaka kommando från kommandoraden till sql plus?

  3. PHP-strängvariabel i WHERE-sats MySQL

  4. Använda Oracle® Heterogeneous Services med två ODBC-datakällor