95 votes

Calculer la différence entre 2 dates / heures 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 deux dates dans Oracle SQL ?

Merci

0 votes

127voto

Thilo Points 108673

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

SQL> select oldest - creation from my_table;

Si votre date est stockée sous forme de données de type caractère, vous devez d'abord la convertir en 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 dispose également d'un type de données TIMESTAMP qui peut également représenter une date (avec l'heure). Si vous soustrayez TIMESTAMP vous obtenez un INTERVAL ; pour extraire des valeurs numériques, utilisez l'option EXTRACT fonction.

3 votes

Y a-t-il eu un changement dans le comportement d'Oracle à un moment donné ? Lorsque je soustrais une date d'une autre, j'obtiens un message de type INTERVAL et non un simple flotteur.

2 votes

@JonofAllTrades : Non, lorsque vous soustrayez des valeurs de type DATE vous obtenez le nombre de jours (sous forme de NUMBER ). Cependant, si vous soustrayez TIMESTAMP vous obtenez INTERVALDS . Vous travaillez probablement avec TIMESTAMP et non DATE valeurs. J'ai édité la réponse.

0 votes

En ce qui concerne votre note - Les deux DATE et TIMESTAMP Les types de données ont une composante temporelle (heures, minutes et secondes). TIMESTAMP possède également une composante de temps en secondes fractionnées (et potentiellement des composantes de fuseau horaire).

16voto

Mohsen Heydari Points 5098
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 vous aidera.

7voto

HyLian Points 2058

Vous pouvez utiliser la fonction to_timestamp pour convertir les dates en horodatage 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

0 votes

J'ai essayé à la fois le to_date et le to_timestamp et les deux me donnent une réponse en jours, arrondie vers le bas, donc si la différence est d'une heure, je reçois une réponse de 0, en multipliant cela par 24 donne 0. Je reçois la réponse correcte si je tape la date et l'heure, mais je ne peux pas le faire pour 25m lignes. Avez-vous une idée ?

3 votes

En utilisant une soustraction entre les horodatages, vous obtiendrez un autre horodatage dans un format tel que "DAYS HOUR:MINS:SECS.milisecs". Vous pouvez le tronquer pour obtenir la valeur dont vous avez besoin.

7 votes

La soustraction entre les horodatages renvoie un type de données INTERVAL. Vous pouvez utiliser la fonction EXTRACT pour renvoyer diverses parties d'un intervalle, par exemple select extract(hour from (timestamp '2009-12-31 14:00:00' - timestamp '2009-12-31 12:15:00')) hr from dual ; Note : Cela ne montre que la partie HOUR, donc si la différence est de 1 jour et 1 heure, cela montrera 1 et non 25.

5voto

SUNIL BEHERA Points 11

Calculer l'âge à partir de HIREDATE jusqu'à 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;

3voto

amitt Gaur Points 11
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 );

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X