2012-12-25 9 views

risposta

4

Se sono date differiscono solo in parte il tempo è possibile utilizzare intervallo di giorni per secondo. Ad esempio:

SQL> select (to_date('25.12.12 15:37:32', 'DD.MM.YY HH24:MI:SS') 
    2  - to_date('25.12.12 12:45:45', 'DD.MM.YY HH24:MI:SS')) day(0) to second(0) as Time 
    3 from dual 
    4 ; 

TIME 
------------- 
+0 02:51:47 

Ma ovviamente non sarà sempre così. Così si potrebbe scrivere un lungo query per calcolare le diverse parti del tempo, ma penso che vorrei andare con questa semplice funzione:

SQL> create or replace function DaysToTime(p_val in number) 
    2 return varchar2 
    3 is 
    4 l_hours number; 
    5 l_minutes number; 
    6 l_seconds number; 
    7 begin 
    8 l_Hours := 24 * p_val; 
    9 l_minutes := (l_hours - trunc(l_hours)) * 60; 
10 l_seconds := (l_minutes - trunc(l_minutes)) * 60; 
11 return to_char(trunc(l_hours), 'fm09') ||':'|| 
12   to_char(trunc(l_minutes), 'fm09')||':'|| 
13   to_char(trunc(l_seconds), 'fm09'); 
14 end; 
15/

Function created 

E ora la domanda sarebbe:

SQL> select DaysToTime(to_date('25.12.12 15:37:32', 'DD.MM.YY HH24:MI:SS') 
    2  - to_date('25.12.12 12:45:45', 'DD.MM.YY HH24:MI:SS')) as Time 
    3 from dual 
    4 ; 

TIME 
---------- 
02:51:47 
1
select 24 * (EVENT_DATE_B - EVENT_DATE_A) || ':' || '00' 
from your_table 

SQLFiddle demo

+2

'EVENT_DATE_B - EVENT_DATE_A' potrebbe non essere un numero intero – turbanoff

+0

questo non va bene per qualcosa di simile' selezionare 24 * (TO_DATE ('25 .12.12 15:37:32' , ' DD.MM.YY HH24: MI: SS ') - to_date ('25 .12.12 12:45:45', 'DD.MM.YY HH24: MI: SS')) || ':' || '00' da dual' – lexeme

4

Un altro approccio (uno query può essere in giorni diversi):

with tt as (
    select numToDsinterval((EVENT_DATE_B - EVENT_DATE_A), 'DAY') dsint 
    from t) 
select (extract(day from dsint)*24)+extract(hour from dsint) || 
     ':' ||extract(minute from dsint) 
from tt 

Here is a sqlfiddle demo

+0

+1 Naturalmente. Per qualche motivo non avevo pensato a 'NumToDSInterval' :) –

1

Penso che sia necessario trovare il numero di giorni tra data1 e data2, quindi sottrarre questa differenza dalla data2 e convertire la data finale nel formato. Copia/incolla e vedere l'output:

Select date2, days_between, to_char(date2-days_between, 'mm-dd-yyyy hh24:mi:ss') end_date 
From 
(
Select sysdate date2 
    , trunc(sysdate)-to_date('20-DEC-2012') days_between --'20-DEC' is start_date 
From dual 
) 
/
Problemi correlati