Tengo una mesa de la siguiente manera:
Filename - varchar
Creation Date - Date format dd/mm/yyyy hh24:mi:ss
Oldest cdr date - Date format dd/mm/yyyy hh24:mi:ss
¿Cómo puedo calcular la diferencia en horas, minutos y segundos (y posiblemente días) entre las dos fechas en Oracle SQL?
Gracias
oracle
date-arithmetic
Steve
fuente
fuente

Respuestas:
Puede restar fechas en Oracle. Esto le dará la diferencia en días. Multiplique por 24 para obtener horas, y así sucesivamente.
SQL> select oldest - creation from my_table;Si su fecha se almacena como datos de caracteres, primero debe convertirla a un tipo de fecha.
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.5Nota :
Esta respuesta se aplica a las fechas representadas por el tipo de datos de Oracle
DATE. Oracle también tiene un tipo de datosTIMESTAMP, que también puede representar una fecha (con hora). Si restaTIMESTAMPvalores, obtiene unINTERVAL; para extraer valores numéricos, use laEXTRACTfunción.fuente
INTERVALtipo de datos, no un simple flotante.DATE, obtiene el número de días (como aNUMBER). Sin embargo, si restaTIMESTAMPvalores, obtieneINTERVALDS. Probablemente estás trabajando con valoresTIMESTAMPy no con ellosDATE. Edité la respuesta.DATEyTIMESTAMPtienen un componente de tiempo (horas, minutos y segundos).TIMESTAMPtambién tiene un componente de tiempo de fracción de segundo (y potencialmente componentes de zona horaria).Para obtener resultados en segundos:
select (END_DT - START_DT)*60*60*24 from MY_TABLE;Marque [ https://community.oracle.com/thread/2145099?tstart=0][1]
fuente
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 ;Espero que esto ayude.
fuente
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] );Esto le dará tres columnas como Días, Horas y Minutos.
fuente
También puede probar esto:
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;Muestra la hora en una forma más legible por humanos, como: 00:01:34. Si necesita también días, simplemente puede agregar DD a la última cadena de formato.
fuente
Puede utilizar la función to_timestamp para convertir las fechas en marcas de tiempo y realizar una operación de resta.
Algo como:
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 DUALfuente
Calcule la edad desde HIREDATE hasta la fecha del sistema de su computadora
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;fuente
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 );fuente
En Oracle 11g
SELECT end_date - start_date AS day_diff FROM tablexxx suppose the starT_date end_date is define in the tablexxxfuente
Si selecciona dos fechas de ' su_tabla ' y también desea ver el resultado como una salida de una sola columna (por ejemplo, ' días - hh: mm: ss '), podría usar algo como esto. Primero puede calcular el intervalo entre estas dos fechas y luego exportar todos los datos que necesita de ese intervalo:
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_tableY eso debería darte un resultado como este: 0 días - 1:14:55
fuente
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 TABLE1fuente
Si desea algo que parezca un poco más simple, intente esto para buscar eventos en una tabla que ocurrieron en el último minuto:
Con esta entrada puede jugar con los valores decimales hasta que obtenga el valor de minutos que desee. El valor .0007 pasa a ser de 1 minuto en lo que respecta a los dígitos significativos de la fecha del sistema. Puede usar múltiplos de eso para obtener cualquier otro valor que desee:
select (sysdate - (sysdate - .0007)) * 1440 from dual;El resultado es 1 (minuto)
Entonces es una cuestión sencilla de comprobar
select * from my_table where (sysdate - transdate) < .00071;fuente
fuente
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;fuente
$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'";fuente
Esto contará el tiempo entre las fechas hasta:
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 dualfuente
Aquí tienes otra opción:
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;fuente
Consulta única que devolverá la diferencia horaria de dos columnas de marca de tiempo:
select INS_TS, MAIL_SENT_TS, extract( hour from (INS_TS - MAIL_SENT_TS) ) timeDiff from MAIL_NOTIFICATIONS;fuente
Si desea obtener la fecha, difiera el uso de la tabla y la columna.
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;fuente