Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle sqlSubtract между две дати

Предполагам, че това е домашна работа, така че някои съвети...

Първо, никога не съхранявайте датите като varchar , това ще причини на вас и на оптимизатора всякакви проблеми.

Второ, date на Oracle datatype може да съхранява само до секунда точност и вашият низ има части от секундата, така че гледате timestamp вместо date . Можете да преобразувате своя низ в времево клеймо с to_timestamp() функция, предаваща подходяща маска за формат . О, добре, чувствам се щедър:

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

Трето, изваждането на два времеви клейма ще ви даде interval тип данни, от който ще трябва да извлечете желаната от вас информация в четим формат. Потърсете в този сайт или другаде за изваждане на времево клеймо, но аз ще ви насоча към този скорошен като проба.

Средната стойност е малко по-сложна, така че може да искате да конвертирате вашите интервали в числа за това; отново потърсете предишни въпроси, като този . Размерът на интервалите, прецизността, която всъщност ви интересува, и начинът, по който искате да бъде форматиран изходът, и т.н. ще имат някакво значение за подхода, който искате да предприемете.

Ако имате нужда от приблизителен резултат, тогава отговорът на @Joachim Isaksson ще ви даде това - „приблизително“ поради закръгляването; продължителност по-малка от секунда ще се покаже като нула, например. Същият ефект може да се види с времеви отпечатъци, прехвърлени към дати, които също губят части от секунди:

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;

По-точен отговор може да бъде намерен чрез извличане на различните компоненти на времевите марки, както във въпрос, към който дадох връзка по-рано. Може да не се нуждаете от всички, ако знаете, че продължителността ви винаги е по-малка от час, да речем, но ако имате нужда от повече от една (т.е. ако продължителността може да бъде повече от минута), тогава използването на междинен израз на обща таблица опростява нещата малко:

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;

С два примерни реда, един с интервал от точно секунда и един с точно 1,5 секунди, това дава резултат 1.25 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Къде са моите кръпки?

  2. Oracle :как да извадите две дати и да получите минути от резултата

  3. Цел на използване на различни видове PL/SQL колекции в Oracle

  4. Как различните услуги в Oracle SOA са свързани една с друга?

  5. Вмъкнете XML с повече от 4000 знака в колона Oracle XMLTYPE