# Oracle 9.2i Datum subtrahieren ausgabe in sekunden



## tplanitz (14. Juli 2006)

Hallo,

ich subtrahiere 2 Datumswerte voneinander die vom Typ timestamp sind:


```
select  to_char (A_DATE_END-A_DATE_BEGIN) interval
from test_table
```

Hat jemand eine Idee wie ich das Ergebnis in sekunden umrechnen kann ohne über den langen Weg der Extract () - Funktion zu gehen? Im moment kommt als Ergebnis nur sowas raus: 

```
Interval 
-------------------
+000012535 12:00:00.001000000
```


----------



## Nico Graichen (14. Juli 2006)

Hi,

Die Funktion DATEDIFF (oder DATE_DIFF?) könnte dir weiterhelfen. Die will aber als Parameter DateTime-Values. Musst du mal schauen, ob sie auch Timestamps akzeptiert.


----------



## tplanitz (14. Juli 2006)

Hi,
ganz herlichen Dank! Es gibt in Oracle diese funktion LEIDER nicht, aber ich habe selber eine mit Hilfe von Google gebastelt und alles funktioniert super. Das schlagwort war "DATEDIFF" , gibts leider nur bei mysql und SQL server. Na egal ich stells trotzdem mal hier ein:

Die Funktion 

```
create or replace function datediff( p_what in varchar2,
                                      p_d1   in date,
                                      p_d2   in date ) return number
 as
     l_result    number;
        begin
        select Round ((p_d2-p_d1) *
        decode( upper(p_what),
                     'SS', 24*60*60, 'MI', 24*60, 'HH', 24, NULL ),2)
       into l_result from dual;

       return l_result;
  end;
   /
```

Der temp_view zum ausprobieren:

```
create or replace view temp_view
 as
 select   
          to_Date('01.01.2006', 'DD/MM/YYYY HH24:MI') d1,
          to_Date('14.07.2006', 'DD/MM/YYYY HH24:MI') d2
  from dual
 /
```


Der Aufruf der Funktion:

```
SELECT datediff('ss', current_timestamp-1, current_timestamp) AS "seconds" FROM dual
```

Beste Grüße Thorsten


----------



## Exceptionfault (14. Juli 2006)

Soweit ist die Funktion i.O. nur bzgl deines ersten Postings machst du einen kleinen Fehler in derFunktion: Sie erwartet INPUT Parameter vom Typ DATE und nicht TIMESTAMP, d.h. Oracle macht eine implizite Konvertierung von Timestamp zu DATE.


```
SQL> select cast( systimestamp AS date ), systimestamp from dual;

CAST(SYSTIMESTAMPAS SYSTIMESTAMP
------------------- ---------------------------------------------------------------------------
14.07.2006 15:20:59 14.07.06 15:20:59,207000 +02:00
```

Wie man sieht gehen dabei die Millisekunden und die Zeitzone verloren. Wenn dir die egal sind, ist ja alles wunderbar ;-)
Ansonsten musst du wohl leider wie oben beschrieben mit EXTRACT arbeiten.


----------



## Nico Graichen (14. Juli 2006)

tplanitz hat gesagt.:
			
		

> Hi,
> ganz herlichen Dank! Es gibt in Oracle diese funktion LEIDER nicht, [..]


Ups, sorry. 
War grad mal wieder so im SQL Server drin, dass ich die Funktion gleich mal wieder verallgemeinert hab.


----------

