web-dev-qa-db-fra.com

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

J'ai une table 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 calculer la différence en heures minutes et secondes (et éventuellement en jours) entre les deux dates dans Oracle SQL?

Merci

71
Steve

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

Remarque :

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

102
Thilo

Pour obtenir un 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][1]

13
Nikolay Frick
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.

13
Mohsen Heydari
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.

12
Ishan Rastogi

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
5
HyLian

Calculez l'âge de HIREDATE à la date 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;
4
SUNIL BEHERA

Vous pouvez aussi 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 par l'homme, par exemple: 00:01:34 . Si vous avez également besoin de jours, vous pouvez simplement ajouter un DD à la dernière chaîne de formatage.

4
RLapinski
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 );
3
amitt Gaur
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
user3496353
(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 
1
user1012506

Si vous voulez quelque chose de plus simple, essayez ceci pour rechercher des événements dans une table qui se sont produits au cours de la dernière minute: 

Avec cette entrée, vous pouvez manipuler les valeurs décimales jusqu'à obtenir la valeur minute que vous souhaitez. La valeur .0007 se trouve être 1 minute en ce qui concerne les chiffres significatifs de sysdate. Vous pouvez utiliser des multiples de cela pour obtenir toute autre valeur que vous souhaitez:

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

Le résultat est 1 (minute)

Ensuite, il est simple de vérifier

select * from my_table where (sysdate - transdate) < .00071;
1
Cliff Adams

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

Si vous sélectionnez deux dates dans 'votre_table' et que vous souhaitez également voir le résultat sous forme de sortie à une seule colonne (par exemple, ' days - hh: mm: ss '), vous pouvez utiliser quelque chose comme: this . Vous pouvez d’abord calculer l’intervalle entre ces deux dates, puis 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 celui-ci: 0 jours - 1:14:55

0
Nik

Si vous souhaitez obtenir une date différente de l'utilisation de la table et de la colonne.

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

dans Oracle 11g 

select end_date - start_date as day_diff de tablexxx suppose que starT_date end_date est défini dans tablexxx

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

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