INTERVAL/INTERVAL-Divisionen

From: Tim Landscheidt <tim(at)tim-landscheidt(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: INTERVAL/INTERVAL-Divisionen
Date: 2009-07-30 00:21:44
Message-ID: m37hxrt3zb.fsf@passepartout.tim-landscheidt.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Hallo,

ich habe vor kurzem eine "Verbrauchsberechnung" von Anwen-
dungslogik auf die window functions von PostgreSQL 8.4 umge-
stellt. Dabei, genauer gesagt bei der "Hochrechnung" auf den
Jahresverbrauch, fiel mir wieder einmal auf, dass es keinen
Operator für INTERVAL/INTERVAL-Divisionen gibt:

| tim=# CREATE TEMPORARY TABLE tmpTest (t TIMESTAMP PRIMARY KEY, v INT NOT NULL);
| HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »tmptest_pkey« für Tabelle »tmptest«
| CREATE TABLE
| tim=# INSERT INTO tmpTest (t, v) VALUES ('2009-06-06 11:34'::TIMESTAMP, 3);
| INSERT 0 1
| tim=# INSERT INTO tmpTest (t, v) VALUES ('2009-06-19 09:05'::TIMESTAMP, 13);
| INSERT 0 1
| tim=# INSERT INTO tmpTest (t, v) VALUES ('2009-07-01 23:00'::TIMESTAMP, 23);
| INSERT 0 1
| tim=# SELECT LAG(t) OVER w,
| tim-# t,
| tim-# (v - LAG(v) OVER w) * '1 year'::INTERVAL / (t - LAG(t) OVER w)
| tim-# FROM tmpTest
| tim-# WINDOW w AS (ORDER BY t)
| tim-# ORDER BY t OFFSET 1;
| FEHLER: Operator existiert nicht: interval / interval
| ZEILE 3: (v - LAG(v) OVER w) * '1 year'::INTERVAL / (t - LAG(t...
| ^
| TIP: Kein Operator stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.
| tim=#

Da INTERVAL ja auch "flexibel" bei der Speicherung von Zeit-
spannen ist und man daher eine Division wahrscheinlich nicht
so unzweideutig definieren kann, ist das verständlich. Ich
umgehe das Problem dann normalerweise mit normaler Arithme-
tik:

| tim=# SELECT LAG(t) OVER w,
| tim-# t,
| tim-# (v - LAG(v) OVER w) * 365 * 24 * 60 * 60 / EXTRACT('epoch' FROM (t - LAG(t) OVER w))
| tim-# FROM tmpTest
| tim-# WINDOW w AS (ORDER BY t)
| tim-# ORDER BY t OFFSET 1;
| lag | t | ?column?
| ---------------------+---------------------+------------------
| 2009-06-06 11:34:00 | 2009-06-19 09:05:00 | 283.021915890367
| 2009-06-19 09:05:00 | 2009-07-01 23:00:00 | 290.146287606956
| (2 Zeilen)
|
| tim=#

Gibt es auch noch eine "schönere" Lösung (außer CREATE OPER-
ATOR :-))?

TIA,
Tim

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message A. Kretschmer 2009-07-30 05:41:40 Re: Nutzungs- und Schreibrechte
Previous Message Peter Jordan 2009-07-29 17:19:41 Nutzungs- und Schreibrechte