sql >> Databáze >  >> RDS >> Mysql

Výpočet rozdílu na řádku datum a čas mezi řádky ve stejné tabulce

Za předpokladu, že každá pauza a konec má vždy začátek, nebylo by něco takového přímější?

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

Nejsem si úplně jistý, jak velké jsou hodnoty, které vycházejí z TO_SECONDS() pro aktuální časová razítka; ale pokud jsou problémem při sčítání, pokud je lze změnit na

   , 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

"Nenormální" data můžete zjistit přidáním následujícího do seznamu vybraných výrazů

, 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

Poznámka:všechny „neuzavřené“ intervaly budou označeny jako abnormální; bez mnohem komplikovanějšího a dražšího začátku a konce kontroly intervalů pro odlišení "otevřeného" od "neplatného" je to asi to nejlepší, co lze udělat. Součet použitý pro další "integrityCheck" rovný -1 může naznačovat otevřený interval, ale může také znamenat chybné dvojité spuštění.




  1. SQL dotaz pro získání mezisoučtu některých řádků

  2. Použití PIVOT v SQL Server 2008

  3. mysql, výpis, obnovení databáze

  4. Jaký mysql ovladač mám použít s pružinou/hibernací?