Blog > Komentarze do wpisu
Zabawa z datami - część 5 - Oracle SQL

 

Często przydatna jest dokładna znajomość różnicy pomiędzy dwiema datami w na przykład minutach bądź sekundach. W sytuacji, gdy użytkownik narzeka na szybkość działania raportu, możemy zmierzyć jego faktyczny czas wykonania i jeśli dysponujemy danymi historycznymi, porównać ten czas ze średnią.

 

Oracle nie oferuje dedykowanej funkcji, która mogłaby nam pomóc, ale tak naprawdę nie jest ona potrzebna. Wystarczy odjąć od siebie dwie daty początkowa i końcową:

 

SELECT   SYSDATE, (SYSDATE - TO_DATE ('04-Jun-2012')) diff FROM DUAL;

 

Zabawa z datami - część 5 - Oracle SQL

 

Powyższe zapytanie zwraca różnicę pomiędzy datą bieżącą a północą 4 czerwca 2012 w dniach. Aby uzyskać bardziej przyjazny wynik, np. w minutach bądź sekundach, wystarczy pomnożyć rezultat powyższego zapytania przed odpowiednią wartość. Tak jak pokazuje to poniższa tabelka:

 

Mnożnik Wzór Rezultat w
1 1 dniach
24 24 godzinach
1440 24 * 60 minutach
86400 24 * 60 * 60 sekundach
8640000 24 * 60 * 60 * 100 milisekundach

 

Zmieniając nasze zapytanie następująco...

 

SELECT   SYSDATE, 
         (SYSDATE - TO_DATE ('04-Jun-2012')) diff_days,
         (SYSDATE - TO_DATE ('04-Jun-2012')) * 24 * 60 * 60 * 100 diff_ms,
         (SYSDATE - TO_DATE ('04-Jun-2012')) * 24 * 60 * 60 diff_sec,
         (SYSDATE - TO_DATE ('04-Jun-2012')) * 24 * 60 diff_min,
         (SYSDATE - TO_DATE ('04-Jun-2012')) * 24 diff_hrs
          FROM DUAL;

 

...uzyskamy:

 

Zabawa z datami - część 5 - Oracle SQL

 

Na zakończenie jeszcze rzeczywisty przykład wykorzystania powyższego zapytania, zwracającego czasy wykonania/średni czas wykonania konkretnego raportu dla konkretnego użytkownika. Dane o uruchamianych raportach przechowywane są w tabeli replog.

 

  SELECT
--  AVG(   
      ROUND (
              (endtime - starttime)
              * DECODE (UPPER ('mi'),
                        'MS', 24 * 60 * 60 * 100,
                        'SS', 24 * 60 * 60,
                        'MI', 24 * 60,
                        'HH', 24,
                        NULL),
              2
           )
-- )           
              timediff_min
              , rl.*
    FROM   replog rl
   WHERE       reportname = 'Report Name'
           AND userid = 'user id'
ORDER BY   repid DESC;
czwartek, 14 czerwca 2012, m0rt1m3r

Related Posts Plugin for WordPress, Blogger...

Polecane wpisy





PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time