sql >> Database >  >> RDS >> Oracle

Oracle sqlAftrekken tussen twee datums

Ik neem aan dat dit huiswerk is, dus wat hints...

Sla eerst nooit datums op als varchar , het zal u en de optimizer allerlei problemen bezorgen.

Ten tweede, Oracle's date datatype kan alleen tot op de seconde nauwkeurig worden opgeslagen, en je string heeft fracties van een seconde, dus je kijkt naar timestamp in plaats van date . Je kunt je string converteren naar een tijdstempel met de to_timestamp() functie, waarbij een geschikt formaatmasker wordt doorgegeven . Oh oké, ik voel me vrijgevig:

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

Ten derde, als je twee tijdstempels aftrekt, krijg je een interval gegevenstype, waaruit u de gewenste informatie in een leesbaar formaat moet extraheren. Zoek op deze site of elders naar het aftrekken van tijdstempels, maar ik verwijs u naar deze recente als voorbeeld.

Het gemiddelde is wat lastiger, dus misschien wil je daarvoor je intervallen omzetten in getallen; zoek opnieuw naar eerdere vragen, zoals deze . De grootte van de intervallen, de precisie die u echt belangrijk vindt, en de manier waarop u de uitvoer wilt formatteren, enz. zullen enige invloed hebben op de benadering die u wilt volgen.

Als je een benaderend resultaat nodig hebt, dan zal het antwoord van @Joachim Isaksson je dat geven - 'bij benadering' vanwege afronding; een duur van minder dan een seconde wordt bijvoorbeeld weergegeven als nul. Hetzelfde effect is te zien met tijdstempels die naar datums zijn gegoten, waarbij ook de fractionele seconden verloren gaan:

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;

Een nauwkeuriger antwoord kan worden gevonden door de verschillende componenten van de tijdstempels te extraheren, zoals in een vraag waarnaar ik eerder heb gelinkt. Je hebt ze misschien niet allemaal nodig als je weet dat je duur altijd minder dan een uur is, maar als je er meer dan één nodig hebt (d.w.z. als een duur meer dan een minuut zou kunnen zijn), dan vereenvoudigt het gebruik van een tussenliggende algemene tabeluitdrukking dingen een beetje:

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;

Met twee voorbeeldrijen, één met een tussenruimte van precies een seconde en één met precies 1,5 seconde, geeft dit het resultaat 1.25 .



  1. Bereken het tijdsverschil tussen twee tijdstempels in mysql

  2. Prestatiemythen:tekenreekskolommen te groot maken

  3. MySQL-syntaxis en 'OF'-prestaties

  4. MySql verbinden met Android zonder PHP te gebruiken