Moje ostatnie zmagania z mierzeniem czasu można prześledzić w postach
Intrygujące wyniki testów wydajnościowych - prześcignąć samego siebie! i OraGP: replace vs. regexp_replace
Także podsumowując: jeśli chcemy zmierzyć czas a w zasadzie różnicę czasu możemy skorzystać z typu danych TIMESTAMP dla większej dokładności lub typu danych DATE, jeśli dokładność w sekundach jest satysfakcjonująca.
W poniższym skrypcie wyliczamy różnicę czasu między start_date i end_date, która dla przykladu wynosi 4 minuty i przedstawiamy ją w różnych jednostkach: sekundach, minutach, godzinach i dniach
with daty (start_tmstp, end_tmstp, start_date, end_date) as (
select to_timestamp(to_char(sysdate, 'yyyymmddhh24miss'),'YYYYMMDDHH24MISS.FF'),
to_timestamp(to_char(sysdate- 4/1440, 'yyyymmddhh24miss'),'YYYYMMDDHH24MISS.FF'),
sysdate, sysdate- 4/1440 from dual
)
select
--- czas dla typ danych TIMESTAMP
to_char(round(extract( day from(start_tmstp - end_tmstp )*24*60*60*100)/100,2), '99990D00') czas_tmstp_sec,
to_char(round(extract( day from(start_tmstp - end_tmstp )*24*60 *100)/100,2), '99990D00') czas_tmstp_min,
to_char(round(extract( day from(start_tmstp - end_tmstp )*24 *100)/100,2), '99990D00') czas_tmstp_godz,
to_char(round(extract( day from(start_tmstp - end_tmstp )*100)/100,2), '99990D00') czas_tmstp_dni,
--- czas dla typ danych DATE
(start_date - end_date)* 24 *60 *60 czas_dt_sec,
(start_date - end_date)* 24 *60 czas_dt_min,
round((start_date - end_date)* 24,2) czas_dt_godz,
round((start_date - end_date) ,2) czas_dt_dni
from daty
;
Jak widać sposób jest bardzo prosty. W pierwszym kroku wyliczamy różnicę między datami jako timestamp lub date a następnie za pomocą mnożenia przeliczamy na oczekiwane przez nas jednostki:
- bez mnożenia - czas przedstawimy w DNIACH
- * 24 - czas przedstawimy GODZINACH
- * 24 * 60 - czas przedstawimy w MINUTACH
- * 24 * 60 * 60 - czas przedstawimy w SEKUNDACH
Komentarze
Prześlij komentarz