# [Oracle 10g] Timestamps addieren (sum)



## looser512 (17. Mai 2006)

hallo zusammen, ich habe hier folgendes problem und vllt könnt ihr mir ja dabei helfen.
Und zwar habe ich eine tabelle in der ich 2 timestamps eintrage. start und stop.

jetzt möchte ich alle die zeit summiert über einen tag mir ausgeben lassen.
hab mir das stmt jetzt mal so zusammengebastelt:


```
select (STOPTIME - STARTTIME) from TIMES where extract(day from STARTTIME) = extract(day from SYSTIMESTAMP);
```

das funktioniert soweit auch recht gut, nur bekomm ich die werte net addiert.
könnt ihr mir vllt bitte weiterfehlen?

vielen dank im voraus.


----------



## ishino (18. Mai 2006)

Die Aggregatsfunktionen von Oracle (SUM, AVG, etc.) können mit TIMESTAMPs nicht umgehen. Wenn Dir eine Genauigkeit von einer Sekunde reicht, kann man das hier:


```
select sum(tmp) 
from
(
	select to_date(to_char(stoptime, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') - 
		to_date(to_char(starttime, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') as tmp
	from ex01
)
```

als Workaround nehmen oder Du änderst den Datentyp in der Tabelle. Mit DATE-Werten arbeiten die Funktionen wie gewohnt.

Also etwas in der Art:


```
select sum(tmp) 
from
(
	select to_date(to_char(stoptime, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') - 
		to_date(to_char(starttime, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') as tmp
	from times 
        where extract(day from starttime) = extract(day from systimestamp)
)
```


----------



## looser512 (18. Mai 2006)

hm, ne leider tut das net, er verschluckt mir immer die stunden, minuten und sekunden.
trotzdem vielen dank.


----------



## ishino (18. Mai 2006)

```
SQL> alter session set nls_timestamp_format = ''YYYY-MM-DD HH:MI:SS.FF';

Session altered.

SQL> create table ex01(starttime timestamp, stoptime timestamp);

Table created.

-- 120 sec (1/24/60/60 * 120)
SQL> insert into ex01 values (systimestamp, systimestamp + 0.0013889);

1 row created.

-- 3600 sec = 1 tag (1/24/60/60 * 3600)
SQL>  insert into ex01 values (systimestamp, systimestamp + 0.04167);

1 row created.

SQL> select * from ex01;

STARTTIME                      STOPTIME
------------------------------ ------------------------------
2006-05-18 11:19:15.841653     2006-05-18 11:21:15.000000
2006-05-18 11:19:48.480260     2006-05-19 12:19:48.000000

SQL> select sum(tmp)
2 from
3 (
4        select to_date(to_char(stoptime, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') -
5                to_date(to_char(starttime, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') as tmp
6        from ex01
7 );

  SUM(TMP)
----------
.043055556


-- 0.0430556/(1/24/60/60) = 3720 sec = 1 tag und 120 sekunden
```


----------

