Calculer la différence entre 2 date / heure dans Oracle SQL

J’ai un tableau comme suit:

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

Comment puis-je calculer la différence en heures minutes et secondes (et éventuellement en jours) entre les deux dates dans Oracle SQL?

Merci

Vous pouvez soustraire des dates dans Oracle. Cela vous donnera la différence en jours. Multipliez par 24 pour obtenir des heures, et ainsi de suite.

 SQL> select oldest - creation from my_table; 

Si votre date est stockée sous forme de données de caractères, vous devez d’abord la convertir en un type de date.

 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 :

Cette réponse s’applique aux dates représentées par le type de données Oracle DATE . Oracle a également un type de données TIMESTAMP , qui peut également représenter une date (avec le temps). Si vous soustrayez des valeurs TIMESTAMP , vous obtenez un INTERVAL ; pour extraire des valeurs numériques, utilisez la fonction EXTRACT .

 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 ; 

J’espère que cela t’aides.

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

Cela vous donnera trois colonnes comme Jours, Heures et Minutes.

Pour obtenir le résultat en quelques secondes:

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

Vérifiez [ https://community.oracle.com/thread/2145099?tstart=0%5D%5B1%5D

Vous pouvez utiliser la fonction to_timestamp pour convertir les dates en horodatages et effectuer une opération de soustraction.

Quelque chose comme:

 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 

Calculer l’âge de HIREDATE à la date du système de votre ordinateur

 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; 

Vous pouvez également essayer ceci:

 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; 

Il affiche l’heure sous une forme plus lisible, comme: 00:01:34. Si vous avez également besoin de jours, vous pouvez simplement append DD à la dernière chaîne de formatage.

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

Si vous voulez quelque chose qui semble un peu plus simple, essayez ceci pour trouver des événements dans une table qui ont eu lieu au cours des 1 dernières minutes:

Avec cette entrée, vous pouvez manipuler les valeurs décimales jusqu’à obtenir la valeur de minute souhaitée. La valeur 0,0007 se situe à 1 minute en ce qui concerne les chiffres significatifs du sysdate. Vous pouvez utiliser plusieurs de ces valeurs pour obtenir toute autre valeur souhaitée:

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

Le résultat est 1 (minute)

Ensuite, il est facile de vérifier

 select * from my_table where (sysdate - transdate) < .00071; 
 (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 
 $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'"; 

Cela comptera le temps entre les dates:

 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 

Voici une autre option:

 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; 

dans l’oracle 11g

select end_date – start_date comme day_diff de tablexxx suppose que la date de fin de starT_date est définie dans la tablexxx

Si vous sélectionnez deux dates dans ” your_table ” et que vous souhaitez également voir le résultat sous la forme d’une seule colonne (par exemple, ” days – hh: mm: ss “), vous pouvez utiliser quelque chose comme ceci. Vous pouvez d’abord calculer l’intervalle entre ces deux dates et ensuite exporter toutes les données dont vous avez besoin à partir de cet intervalle:

  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 

Et cela devrait vous donner un résultat comme ceci: 0 jours – 1:14:55