sql >> Database teknologi >  >> RDS >> Oracle

Oracle sqlTræk mellem to datoer

Jeg går ud fra, at dette er hjemmearbejde, så nogle tip...

Gem først aldrig datoer som varchar , vil det give dig og optimeringsværktøjet alle mulige problemer.

For det andet Oracles dato datatype kan kun gemme til anden præcision, og din streng har brøkdele af et sekund, så du ser på tidsstempel i stedet for dato . Du kan konvertere din streng til et tidsstempel med code>to_timestamp() funktion ved at sende en passende formatmaske . Åh ok, jeg føler mig generøs:

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

For det tredje vil fratræk af to tidsstempler give dig en interval datatype, hvorfra du skal udtrække de ønskede oplysninger i et læsbart format. Søg på dette websted eller andre steder efter tidsstempelsubtraktion, men jeg vil henvise dig til denne seneste som et eksempel.

Gennemsnittet er lidt vanskeligere, så du vil måske konvertere dine intervaller til tal for det; søg igen efter tidligere spørgsmål, såsom denne . Størrelsen af ​​intervallerne, den præcision, du faktisk interesserer dig for, og den måde, du vil have outputtet formateret på osv., vil have en vis indflydelse på den tilgang, du ønsker at tage.

Hvis du har brug for et omtrentligt resultat, så vil @Joachim Isakssons svar give dig det - 'omtrentlig' på grund af afrunding; en varighed på mindre end et sekund vil for eksempel vise sig som nul. Den samme effekt kan ses med tidsstempler, der er castet til datoer, som også mister de brøkdele sekunder:

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;

Et mere præcist svar kan findes ved at udtrække de forskellige komponenter i tidsstemplerne, som i et spørgsmål, jeg linkede til tidligere. Du har muligvis ikke brug for dem alle, hvis du ved, at dine varigheder altid er mindre end en time, f.eks., men hvis du har brug for mere end én (dvs. hvis en varighed kan være mere end et minut), så forenkler brugen af ​​et mellemliggende fælles tabeludtryk tingene. 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 to eksempelrækker, en med et mellemrum på præcis et sekund og en med nøjagtigt 1,5 sekunder, giver dette resultatet 1,25 .



  1. Optimering af opdateringsforespørgsler

  2. SQL SERVER 2008 JOIN tip

  3. SQL Server fejlhåndtering:undtagelser og database-klient kontrakten

  4. Betinget kolonne til forespørgsel baseret på andre kolonner i MySQL