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
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
.
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]
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.
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
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;
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.
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
(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
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;
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
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
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;
dans Oracle 11g
select end_date - start_date as day_diff de tablexxx suppose que starT_date end_date est défini dans tablexxx
$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'";
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;