Oracle вычитание даты - PullRequest
       30

Oracle вычитание даты

2 голосов
/ 02 октября 2009

Как мне написать выражение, которое дает мне разницу между двумя датами в днях, часах, минутах, секундах и т. Д.? По умолчанию вычитание двух дат в oracle возвращает дни в виде десятичной дроби.

Ответы [ 4 ]

6 голосов
/ 02 октября 2009

Использование:

SELECT TO_CHAR(date1,'MMDDYYYY:HH24:MI:SS') date1,
       TO_CHAR(date2,'MMDDYYYY:HH24:MI:SS') date2,
       TRUNC(86400*(date2-date1)) - 60*(TRUNC((86400*(date2-date1))/60)) seconds,
       TRUNC((86400*(date2-date1))/60) - 60*(TRUNC(((86400*(date2-date1))/60)/60)) minutes,
       TRUNC(((86400*(date2-date1))/60)/60) - 24*(TRUNC((((86400*(date2-date1))/60)/60)/24)) hours,
       TRUNC((((86400*(date2-date1))/60)/60)/24) days,
       TRUNC(((((86400*(date2-date1))/60)/60)/24)/7) weeks
  FROM TABLE

Ссылка: Сравнение типов данных Oracle DATE и TIMESTAMP

4 голосов
/ 02 октября 2009

Эта десятичная дробь - это разница в количестве дней между двумя указанными датами. Вы можете сделать небольшую математику, чтобы преобразовать ее в дни, часы, минуты, секунды и т. Д.

РЕДАКТИРОВАТЬ : Я вижу, что вы ищете. Я уверен, что есть более простой способ, но я бы, вероятно, достиг бы его таким образом:

select trunc(5.3574585) days, 
       trunc(mod((5.3574585) * 24, 24)) hours, 
       trunc(mod((5.3574585) * 24 * 60, 60)) minutes, 
       trunc(mod((5.3574585) * 24 * 60 * 60, 60)) seconds 
  from dual;

... где 5.3574585 - количество дней, возвращаемых вычитанием ...

Примечание: это на самом деле не проверено, это не в моей голове.

3 голосов
/ 02 октября 2009

Почему бы просто не преобразовать в метку времени и неявно использовать интервал «день» для второго типа данных?

select to_timestamp(sysdate+1.1234) - to_timestamp(sysdate) diff
from dual
/

DIFF        
----------- 
1 2:57:42.0 
3 голосов
/ 02 октября 2009

Вы можете конвертировать даты в метки времени и использовать встроенные функции для вывода отдельных компонентов ...

SELECT EXTRACT( DAY    FROM ( end_timestamp - start_timestamp ) )   days
     , EXTRACT( HOUR   FROM ( end_timestamp - start_timestamp ) )   hours
     , EXTRACT( MINUTE FROM ( end_timestamp - start_timestamp ) )   minutes
     , EXTRACT( SECOND FROM ( end_timestamp - start_timestamp ) )   seconds
  FROM ( SELECT TO_TIMESTAMP( TO_CHAR( start_date, 'DD/MM/YYYY HH24:MI:SS' )
                            , 'DD/MM/YYYY HH24:MI:SS' )   start_timestamp
              , TO_TIMESTAMP( TO_CHAR( end_date, 'DD/MM/YYYY HH24:MI:SS' )
                            , 'DD/MM/YYYY HH24:MI:SS' )   end_timestamp
           FROM ( SELECT TO_DATE( '01/10/2009 14:25:01'
                                , 'DD/MM/YYYY HH24:MI:SS' )   start_date
                       , TO_DATE( '03/10/2009 23:09:15'
                                , 'DD/MM/YYYY HH24:MI:SS' )   end_date
                    FROM dual
                )
       )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...