Рассчитайте разницу между 2 датой / временем в 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?

Спасибо

 user56586912 дек. 2014 г., 17:53

Ответы на вопрос(16)

select days||' '|| time from (
SELECT to_number( to_char(to_date('1','J') +
    (CLOSED_DATE - CREATED_DATE), 'J') - 1)  days,
   to_char(to_date('00:00:00','HH24:MI:SS') +
      (CLOSED_DATE - CREATED_DATE), 'HH24:MI:SS') time
 FROM  request  where REQUEST_ID=158761088 );

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;
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] 
     );

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

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

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

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

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

select * from my_table where (sysdate - transdate) < .00071;
 25 окт. 2016 г., 09:06
.0007 жестко запрограммирован, пожалуйста, исправьте

на 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

Note:

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

 23 авг. 2017 г., 11:11
Что касается вашей заметки - обаDATE а такжеTIMESTAMP Типы данных имеют компонент времени (часы, минуты и секунды).TIMESTAMP также имеет долю времени в долях секунды (и, возможно, компоненты часового пояса).
 12 дек. 2014 г., 17:42
Произошли ли изменения в поведении Oracle в какой-то момент? Когда я вычитаю одно свидание из другого, я получаюINTERVAL Тип данных, а не просто с плавающей точкой.
 30 июн. 2015 г., 11:32
@JonofAllTrades: Нет, когда вы вычитаете значения типаDATEВы получите количество дней (какNUMBER). Тем не менее, если вычестьTIMESTAMP ценности, вы получаетеINTERVALDS, Вероятно, вы работаете сTIMESTAMP и неDATE ценности. Я отредактировал ответ.

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

         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

And that should give you result like this: 0 days - 1:14:55

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 к последней строке форматирования.

(TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*60*24 sum_seconds,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*60*24 sum_minutes,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi'))*24 sum_hours,
         (TO_DATE(:P_comapre_date_1, 'dd-mm-yyyy hh24:mi') - TO_DATE(:P_comapre_date_2, 'dd-mm-yyyy hh24:mi')) sum_days 
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 ;

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

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

Проверьте [https://community.oracle.com/thread/2145099?tstart=0][1]

select (floor(((DATE2-DATE1)*24*60*60)/3600)|| ' : ' ||floor((((DATE2-DATE1)*24*60*60) -floor(((DATE2-DATE1)*24*60*60)/3600)*3600)/60)|| '  ' ) as time_difference from TABLE1 

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;

ременные метки и выполнения операции вычитания.

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

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
 08 июл. 2009 г., 11:31
какие единицы это даст? часы? миллисекунды? щепки?
 Steve08 июл. 2009 г., 11:41
Я пробовал оба t, он to_date и to_timestamp, и оба дают мне ответ в днях, округленных в меньшую сторону, поэтому, если разница составляет 1 час, я получаю ответ 0, умножение на 24 дает 0. Я получаю правильный ответ, если я введите дату и время, но я не могу сделать это для 25-метровых строк. Какие-нибудь мысли?
 08 июл. 2009 г., 11:57
Используя вычитание между временными метками, он вернет вам другую временную метку в формате, подобном «DAYS HOUR: MINS: SECS.milisecs». Вы можете обрезать это, чтобы получить значение, которое вам нужно
 09 июл. 2009 г., 00:42
Вычитание между временными метками возвращает тип данных INTERVAL. Вы можете использовать функцию EXTRACT, чтобы возвратить различные части интервала, например, выбрать выдержку (час от (отметка времени '2009-12-31 14: 00: 00' - отметка времени '2009-12-31 12: 15: 00') ) час от двойного; Примечание: это показывает только часть ЧАС, поэтому, если разница составляет 1 день и 1 час, будет отображаться 1, а не 25.

выберите end_date - start_date как day_diff из таблицыxxx предположим, что end_date starT_date определено в таблицеxxx

$sql="select bsp_bp,user_name,status,
to_char(ins_date,'dd/mm/yyyy hh12:mi:ss AM'),
to_char(pickup_date,'dd/mm/yyyy hh12:mi:ss AM'),
trunc((pickup_date-ins_date)*24*60*60,2),message,status_message 
from valid_bsp_req where id >= '$id'"; 

Ваш ответ на вопрос