У меня есть следующая таблица:
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?
Благодарность
Ответы:
Вы можете вычесть даты в 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
функцию.источник
INTERVAL
тип данных, а не просто число с плавающей запятой.DATE
, вы получаете количество дней (какNUMBER
). Однако, если вычестьTIMESTAMP
значения, вы получитеINTERVALDS
. Вероятно, вы работаете с ценностями,TIMESTAMP
а не с нимиDATE
. Я отредактировал ответ.DATE
иTIMESTAMP
имеют компонент времени (часы, минуты и секунды).TIMESTAMP
также имеет компонент времени в долях секунд (и, возможно, компоненты часового пояса).Чтобы получить результат за секунды:
select (END_DT - START_DT)*60*60*24 from MY_TABLE;
Отметьте [ https://community.oracle.com/thread/2145099?tstart=0 provided[1 ]).
источник
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 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] );
Это даст вам три столбца: Дни, Часы и Минуты.
источник
Вы также можете попробовать это:
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_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
источник
Рассчитайте возраст от 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;
источник
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 );
источник
В оракуле 11g
SELECT end_date - start_date AS day_diff FROM tablexxx suppose the starT_date end_date is define in the tablexxx
источник
Если вы выбираете две даты из 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
источник
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 минуту:
С помощью этой записи вы можете возиться с десятичными значениями, пока не получите желаемое значение минут. Значение .0007 составляет 1 минуту, что касается значащих цифр sysdate. Вы можете использовать его, кратное этому, чтобы получить любое другое значение, которое хотите:
select (sysdate - (sysdate - .0007)) * 1440 from dual;
Результат 1 (минута)
Тогда просто проверить
select * from my_table where (sysdate - transdate) < .00071;
источник
источник
select to_char(actual_start_date,'DD-MON-YYYY hh24:mi:ss') start_time, to_char(actual_completion_date,'DD-MON-YYYY hh24:mi:ss') end_time, floor((actual_completion_date-actual_start_date)*24*60)||'.'||round(mod((actual_completion_date-actual_start_date)*24*60*60,60)) diff_time from fnd_concurrent_requests order by request_id desc;
источник
$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'";
источник
Это будет считать время между датами:
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
источник
Вот еще вариант:
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 INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff from MAIL_NOTIFICATIONS;
источник
Если вы хотите получить отсрочку даты от использования таблицы и столбца.
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;
источник