sql >> Database teknologi >  >> RDS >> Mysql

Beregning af forskel på dato og klokkeslæt række mellem rækker på samme tabel

Hvis vi antager, at der altid er en start for hver pause og afslutning, ville sådan noget ikke være mere direkte?

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
 

Jeg er umiddelbart ikke helt sikker på, hvor store værdierne, der kommer ud af TO_SECONDS() er for aktuelle tidsstempler; men hvis de er et problem, når de summeres, kan hvis ændres til

, 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 detektere "unormale" data ved at tilføje følgende til listen over udvalgte udtryk

, 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
 

Bemærk:alle "ulukkede" intervaller vil blive markeret som unormale; uden meget mere kompliceret og dyrt start- og sluttjek for intervaller for at skelne "åben" fra "ugyldig", er det nok det bedste, der kan gøres. Summen brugt for yderligere "integrityCheck" svarende til -1 kan antyde et åbent interval, men kan også indikere en fejlagtig dobbeltstart.




  1. Rails multitenant arkitektur, scoping adgang til flere lejere

  2. Specialbygget statistik

  3. Få forskel i år mellem to datoer i MySQL som et heltal

  4. Henter antallet af rækker med en bestemt værdi efter filtrering af forespørgsel gennem datovælger