Вопрос по oracle, date-arithmetic – Рассчитайте разницу между 2 датой / временем в Oracle SQL

71

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

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?

Спасибо

Near-дубликата:stackoverflow.com/questions/9322935/… user565869

Ваш Ответ

16   ответов
13
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 ;

3
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 );
0

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
0

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;
0

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

4

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

13

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

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

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 
1
(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 
4

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;
1

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

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

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

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

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

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

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

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

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

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

102

на 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 функция.

Что касается вашей заметки - обаDATE а такжеTIMESTAMP Типы данных имеют компонент времени (часы, минуты и секунды).TIMESTAMP также имеет долю времени в долях секунды (и, возможно, компоненты часового пояса).
Произошли ли изменения в поведении Oracle в какой-то момент? Когда я вычитаю одно свидание из другого, я получаюINTERVAL Тип данных, а не просто с плавающей точкой.
@JonofAllTrades: Нет, когда вы вычитаете значения типаDATEВы получите количество дней (какNUMBER). Тем не менее, если вычестьTIMESTAMP ценности, вы получаетеINTERVALDS, Вероятно, вы работаете сTIMESTAMP и неDATE ценности. Я отредактировал ответ.
12
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] 
     );

0
$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'"; 

Похожие вопросы