sql >> Databasteknik >  >> RDS >> Oracle

Oracle sql Subtrahera mellan två datum

Jag antar att detta är läxor, så några tips...

Först, spara aldrig datum som varchar , kommer det att orsaka dig och optimeraren alla möjliga problem.

För det andra Oracles datum datatype kan bara lagra till andra precision, och din sträng har bråkdelar av en sekund, så du tittar på tidsstämpel snarare än datum . Du kan konvertera din sträng till en tidsstämpel med code>to_timestamp() funktion, skickar en lämplig formatmask . Åh okej, jag känner mig generös:

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

För det tredje, subtrahera två tidsstämplar ger dig en intervall datatyp, från vilken du kommer att behöva extrahera den information du vill ha i ett läsbart format. Sök på den här webbplatsen eller någon annanstans efter tidsstämpelsubtraktion, men jag visar dig denna senaste som ett exempel.

Genomsnittet är lite knepigare, så du kanske vill konvertera dina intervaller till siffror för det; sök igen efter tidigare frågor, som denna . Storleken på intervallen, precisionen du faktiskt bryr dig om och hur du vill att utdata ska formateras, etc. kommer att ha en viss betydelse för vilket tillvägagångssätt du vill ta.

Om du behöver ett ungefärligt resultat så kommer @Joachim Isakssons svar att ge dig det - 'ungefärligt' på grund av avrundning; en varaktighet på mindre än en sekund visas till exempel som noll. Samma effekt kan ses med tidsstämplar som skickas till datum, som också förlorar bråkdelssekunderna:

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;

Ett mer exakt svar kan hittas genom att extrahera de olika komponenterna i tidsstämplarna, som i en fråga jag länkade till tidigare. Du kanske inte behöver dem alla om du vet att dina varaktigheter alltid är mindre än en timme, till exempel, men om du behöver mer än en (dvs om en varaktighet kan vara mer än en minut) så förenklar det att använda ett mellanliggande gemensamt tabelluttryck. 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;

Med två exempelrader, en med ett mellanrum på exakt en sekund och en med exakt 1,5 sekunder, ger detta resultatet 1,25 .



  1. postgresql generera sekvens utan mellanrum

  2. Topp 9 tips för att ställa in ditt SQL Server-kluster

  3. Exekveringsprocess för Postgresql-funktioner

  4. Kan inte släppa fält i MariaDB/MySql-tabellen med FOREIGN KEY