Вычислить разницу между двумя датами и временем в Oracle SQL

У меня есть следующая таблица:

Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss

Как я могу вычислить разницу в часах, минутах и ​​секундах (и, возможно, днях) между двумя датами в Oracle SQL?

Спасибо


person Steve    schedule 08.07.2009    source источник
comment
Почти дубликат: stackoverflow.com/questions/9322935/   -  person    schedule 12.12.2014


Ответы (15)


Вы можете вычесть даты в Oracle. Это даст вам разницу в днях. Умножьте на 24, чтобы получить часы, и так далее.

SQL> select oldest - creation from my_table;

Если ваша дата хранится как символьные данные, вы должны сначала преобразовать ее в тип даты.

SQL> select 24 * (to_date('2009-07-07 22:00', 'YYYY-MM-DD hh24:mi') 
             - to_date('2009-07-07 19:30', 'YYYY-MM-DD hh24:mi')) diff_hours 
       from dual;

DIFF_HOURS
----------
       2.5

Примечание.

Этот ответ относится к датам, представленным типом данных Oracle DATE. Oracle также имеет тип данных TIMESTAMP, который также может представлять дату (со временем). Если вычесть TIMESTAMP значений, вы получите INTERVAL; для извлечения числовых значений используйте функцию EXTRACT.

person Thilo    schedule 08.07.2009
comment
Изменилось ли в какой-то момент поведение Oracle? Когда я вычитаю одну дату из другой, я получаю тип данных INTERVAL, а не простое число с плавающей запятой. - person ; 12.12.2014
comment
@JonofAllTrades: Нет, когда вы вычитаете значения типа DATE, вы получаете количество дней (как NUMBER). Однако если вычесть TIMESTAMP значений, вы получите INTERVALDS. Вероятно, вы работаете со значениями TIMESTAMP, а не DATE. Я отредактировал ответ. - person sleske; 30.06.2015
comment
Что касается вашего примечания - оба типа данных DATE и TIMESTAMP имеют компонент времени (часы, минуты и секунды). TIMESTAMP также имеет компонент времени в долях секунд (и, возможно, компоненты часового пояса). - person MT0; 23.08.2017
comment
Это даст вам разницу в днях. Не могли бы вы дать ссылку на документацию Oracle? - person Roland; 28.01.2020

Чтобы получить результат за секунды:

select (END_DT - START_DT)*60*60*24 from MY_TABLE;

Отметьте [https://community.oracle.com/thread/2145099?tstart=0visible[1pting

person Nikolay Frick    schedule 29.10.2015

declare
strTime1 varchar2(50) := '02/08/2013 01:09:42 PM';
strTime2 varchar2(50) := '02/08/2013 11:09:00 PM';
v_date1 date := to_date(strTime1,'DD/MM/YYYY HH:MI:SS PM');
v_date2 date := to_date(strTime2,'DD/MM/YYYY HH:MI:SS PM');
difrence_In_Hours number;
difrence_In_minutes number;
difrence_In_seconds number;
begin
    difrence_In_Hours   := (v_date2 - v_date1) * 24;
    difrence_In_minutes := difrence_In_Hours * 60;
    difrence_In_seconds := difrence_In_minutes * 60;

    dbms_output.put_line(strTime1);        
    dbms_output.put_line(strTime2);
    dbms_output.put_line('*******');
    dbms_output.put_line('difrence_In_Hours  : ' || difrence_In_Hours);
    dbms_output.put_line('difrence_In_minutes: ' || difrence_In_minutes);
    dbms_output.put_line('difrence_In_seconds: ' || difrence_In_seconds);        
end ;

Надеюсь это поможет.

person Mohsen Heydari    schedule 09.02.2013

select 
    extract( day from diff ) Days, 
    extract( hour from diff ) Hours, 
    extract( minute from diff ) Minutes 
from (
        select (CAST(creationdate as timestamp) - CAST(oldcreationdate as timestamp)) diff   
        from [TableName] 
     );

Это даст вам три столбца: Дни, Часы и Минуты.

person Ishan Rastogi    schedule 27.11.2014

Вы также можете попробовать это:

select to_char(to_date('1970-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss')+(end_date - start_date),'hh24:mi:ss')
       as run_time from some_table;

Он отображает время в более удобочитаемой форме, например: 00:01:34. Если вам нужны также дни, вы можете просто добавить DD в последнюю строку форматирования.

person RLapinski    schedule 30.01.2015

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

Что-то вроде:

SELECT 
TO_TIMESTAMP ('13.10.1990 00:00:00','DD.MM.YYYY HH24:MI:SS')  - 
TO_TIMESTAMP ('01.01.1990:00:10:00','DD.MM.YYYY:HH24:MI:SS')
FROM DUAL
person HyLian    schedule 08.07.2009
comment
Я пробовал использовать как to_date, так и to_timestamp, и оба дают мне ответ в днях с округлением в меньшую сторону, поэтому, если разница составляет 1 час, я получаю ответ 0, умножение этого на 24 дает 0. Я получаю правильный ответ, если набираю текст. дата и время, но я не могу этого сделать для 25-метровых строк. Есть предположения? - person Steve; 08.07.2009
comment
Используя вычитание между отметками времени, он вернет вам другую отметку времени в формате, например, DAYS HOUR: MINS: SECS.milisecs. Вы можете обрезать это, чтобы получить нужное значение - person HyLian; 08.07.2009
comment
Вычитание между отметками времени возвращает тип данных INTERVAL. Вы можете использовать функцию EXTRACT для возврата различных частей интервала, например, select extract (hour from (timestamp '2009-12-31 14:00:00' - timestamp '2009-12-31 12:15:00')) hr от двойного; Примечание: здесь показана только часть HOUR, поэтому, если разница составляет 1 день и 1 час, будет отображаться 1, а не 25. - person Gary Myers; 09.07.2009

Рассчитайте возраст от HIREDATE до системной даты вашего компьютера

SELECT HIREDATE||'        '||SYSDATE||'       ' ||
TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12) ||' YEARS '||
TRUNC((MONTHS_BETWEEN(SYSDATE,HIREDATE))-(TRUNC(MONTHS_BETWEEN(SYSDATE,HIREDATE)/12)*12))||
'MONTHS' AS "AGE  "  FROM EMP;
person SUNIL BEHERA    schedule 07.10.2012

В оракуле 11g

SELECT end_date - start_date AS day_diff FROM tablexxx
suppose the starT_date end_date is define in the tablexxx
person Michael    schedule 07.10.2015

Если вы выбрали две даты из "your_table" и хотите также видеть результат в виде одного выходного столбца (например, "days - hh: mm: ss ') вы можете использовать что-то вроде этого. Сначала вы можете рассчитать интервал между этими двумя датами, а затем экспортировать все необходимые данные из этого интервала:

         select     extract (day from numtodsinterval (second_date
                                                   - add_months (created_date,
                                                                 floor (months_between (second_date,created_date))),
                                                   'day'))
             || ' days - '
             || extract (hour from numtodsinterval (second_date
                                                    - add_months (created_date,
                                                                  floor (months_between (second_date,created_date))),
                                                    'day'))
             || ':'
             || extract (minute from numtodsinterval (second_date
                                                      - add_months (created_date,
                                                                    floor (months_between (second_date, created_date))),
                                                      'day'))
             || ':'
             || extract (second from numtodsinterval (second_date
                                                      - add_months (created_date,
                                                                    floor (months_between (second_date, created_date))),
                                                      'day'))
     from    your_table

Результат должен быть примерно таким: 0 дней - 1:14:55.

person Nik    schedule 05.06.2018

Если вы хотите что-то, что выглядит немного проще, попробуйте это для поиска событий в таблице, которые произошли за последнюю 1 минуту:

С помощью этой записи вы можете возиться с десятичными значениями, пока не получите желаемое значение минут. Значение .0007 составляет 1 минуту, что касается значащих цифр sysdate. Вы можете использовать его, кратное этому, чтобы получить любое другое значение, которое хотите:

select (sysdate - (sysdate - .0007)) * 1440 from dual;

Результат 1 (минута)

Тогда просто проверить

select * from my_table where (sysdate - transdate) < .00071;
person Cliff Adams    schedule 29.08.2016

Если вы хотите получить отсрочку даты от использования таблицы и столбца.

SELECT TO_DATE( TO_CHAR(COLUMN_NAME_1, 'YYYY-MM-DD'), 'YYYY-MM-DD') - 
       TO_DATE(TO_CHAR(COLUMN_NAME_2, 'YYYY-MM-DD') , 'YYYY-MM-DD')  AS DATEDIFF       
FROM TABLE_NAME;
person Nurullah    schedule 21.08.2019

Это будет считать время между датами:

SELECT
  (TO_CHAR( TRUNC (ROUND(((sysdate+1) - sysdate)*24,2))*60,'999999')
  +
  TO_CHAR(((((sysdate+1)-sysdate)*24)- TRUNC(ROUND(((sysdate+1) - sysdate)*24,2)))/100*60 *100, '09'))/60
FROM dual
person gpio    schedule 28.09.2013

Вот еще вариант:

with tbl_demo AS
    (SELECT TO_DATE('11/26/2013 13:18:50', 'MM/DD/YYYY HH24:MI:SS') dt1
   , TO_DATE('11/28/2013 21:59:12', 'MM/DD/YYYY HH24:MI:SS') dt2 
     FROM dual)
SELECT dt1
     , dt2
     , round(dt2 - dt1,2) diff_days
     , round(dt2 - dt1,2)*24 diff_hrs
     , numtodsinterval((dt2 - dt1),'day') diff_dd_hh_mm_ss
  from tbl_demo;
person Community    schedule 14.02.2014

Единый запрос, который вернет разницу во времени двух столбцов временных меток:

select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff 
from MAIL_NOTIFICATIONS;
person Sandeep Raul    schedule 12.06.2019

выберите round ((tbl.Todate - tbl.fromDate) * 24 * 60 * 60) из таблицы tbl

person Farrukh Saleem Sheikh    schedule 19.02.2021