sql >> Databáze >  >> RDS >> Oracle

Oracle sqlSubtract mezi dvěma daty

Předpokládám, že je to domácí úkol, takže nějaké rady...

Nejprve nikdy neukládejte data jako varchar , způsobí vám i optimalizátoru nejrůznější problémy.

Za druhé, date Oracle datový typ lze ukládat pouze s přesností na sekundu a váš řetězec má zlomky sekundy, takže se díváte na timestamp spíše než date . Řetězec můžete převést na časové razítko pomocí to_timestamp() předáním vhodné masky formátu . Dobře, cítím se velkoryse:

select to_timestamp(start_date, 'DD-Mon-RR HH.MI.SS.FF9 AM') from your_table;

Za třetí, odečtením dvou časových razítek získáte interval datový typ, ze kterého budete muset extrahovat požadované informace v čitelném formátu. Vyhledejte na tomto webu nebo jinde odečítání časových razítek, ale já vás odkážu na tento nedávný jako vzorek.

Průměr je trochu složitější, takže možná budete chtít převést intervaly na čísla; znovu vyhledejte předchozí otázky, například tuto . Velikost intervalů, přesnost, na které vám skutečně záleží, a způsob, jakým chcete výstup formátovat atd., budou mít určitý vliv na přístup, který chcete zvolit.

Pokud potřebujete přibližný výsledek, pak odpověď @Joachima Isakssona vám dá, že - 'přibližný' kvůli zaokrouhlování; doba trvání kratší než jedna sekunda se zobrazí například jako nula. Stejný efekt lze pozorovat u časových razítek přenesených na data, která také ztrácejí zlomky sekund:

select 24*60*60*avg(
    cast(to_timestamp(step_ending_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as date)
        - cast(to_timestamp(step_starting_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as date)
    ) as avg_duration
from process_audit;

Přesnější odpověď lze nalézt extrahováním různých součástí časových razítek, jako v otázce, na kterou jsem odkazoval dříve. Možná je nebudete potřebovat všechny, pokud víte, že vaše doby trvání jsou vždy kratší než hodinu, řekněme, ale pokud potřebujete více než jednu (tj. pokud by doba trvání mohla být delší než minuta), pak použití přechodného běžného tabulkového výrazu zjednodušuje věci. bit:

with cte as (
    select to_timestamp(step_ending_time, 'DD-Mon-RR HH.MI.SS.FF9 AM')
        - to_timestamp(step_starting_time, 'DD-Mon-RR HH.MI.SS.FF9 AM') as duration
    from process_audit
)
select avg(extract(second from duration)
    + extract(minute from duration) * 60
    + extract(hour from duration) * 60 * 60
    + extract(day from duration) * 60 * 60 * 24) as avg_duration
from cte;

Se dvěma ukázkovými řádky, jeden s přesně sekundovou mezerou a druhý přesně 1,5 sekundy, to dává výsledek 1.25 .



  1. Vytvořte spouštěč pro vložení do jiné tabulky

  2. Systém Windows nemůže najít „http://.127.0.0.1:%HTTPPORT%/apex/f?p=4950“. Ujistěte se, že jste jméno zadali správně, a zkuste to znovu

  3. Jak vrátím 0 z databáze MySQL, když termín v klauzuli Where není v databázi?

  4. Jak odečíst 2 data v oracle, abyste získali výsledek v hodině a minutě