INTERVAL/INTERVAL-Divisionen

INTERVAL/INTERVAL-Divisionen

am 30.07.2009 02:21:44 von Tim Landscheidt

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=3D# CREATE TEMPORARY TABLE tmpTest (t TIMESTAMP PRIMARY KEY, v INT NO=
T NULL);
| HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index =BBtmp=
test_pkey=AB für Tabelle =BBtmptest=AB
| CREATE TABLE
| tim=3D# INSERT INTO tmpTest (t, v) VALUES ('2009-06-06 11:34'::TIMESTAMP,=
3);
| INSERT 0 1
| tim=3D# INSERT INTO tmpTest (t, v) VALUES ('2009-06-19 09:05'::TIMESTAMP,=
13);
| INSERT 0 1
| tim=3D# INSERT INTO tmpTest (t, v) VALUES ('2009-07-01 23:00'::TIMESTAMP,=
23);
| INSERT 0 1
| tim=3D# 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 Argumenttype=
n überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen =
hinzufügen.
| tim=3D#

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=3D# SELECT LAG(t) OVER w,
| tim-# t,
| tim-# (v - LAG(v) OVER w) * 365 * 24 * 60 * 60 / EXTRACT('epoch' F=
ROM (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=3D#

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

TIA,
Tim

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: INTERVAL/INTERVAL-Divisionen

am 30.07.2009 07:48:25 von andreas.kretschmer

In response to Tim Landscheidt :
> Hallo,
>=20
> 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:

Hm, mal rein logisch: was soll denn 1 Stunde geteilt durch 5 Minuten
ergeben? Oder anders, die Umkehrung der Division: sind 5 Sekunden * 10
Sekunden dann 50 Quadratsekunden?

Ich denke mal, Deine Cast-Lösung ist okay und einfacher wird es nicht
gehen.=20


Andreas
--=20
Andreas Kretschmer
Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: INTERVAL/INTERVAL-Divisionen

am 30.07.2009 09:34:41 von Peter Eisentraut

On Thursday 30 July 2009 08:48:25 A. Kretschmer wrote:
> In response to Tim Landscheidt :
> > 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:
>
> Hm, mal rein logisch: was soll denn 1 Stunde geteilt durch 5 Minuten
> ergeben?

12

> Oder anders, die Umkehrung der Division: sind 5 Sekunden * 10
> Sekunden dann 50 Quadratsekunden?

Theoretisch schon, aber das hat nichts direkt mit seiner Frage zu tun.

Ich glaube das Problem ist eher, dass die Divison von Intervallen nicht=20
wohldefiniert ist, wenn Monate und Jahre mit Stunden, Minuten und Sekunden=
=20
vermischt werden.

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: INTERVAL/INTERVAL-Divisionen

am 30.07.2009 09:59:40 von andreas.kretschmer

In response to Peter Eisentraut :
> On Thursday 30 July 2009 08:48:25 A. Kretschmer wrote:
> > In response to Tim Landscheidt :
> > > 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:
> >
> > Hm, mal rein logisch: was soll denn 1 Stunde geteilt durch 5 Minuten
> > ergeben?
>=20
> 12
>=20
> > Oder anders, die Umkehrung der Division: sind 5 Sekunden * 10
> > Sekunden dann 50 Quadratsekunden?
>=20
> Theoretisch schon, aber das hat nichts direkt mit seiner Frage zu tun.
>=20
> Ich glaube das Problem ist eher, dass die Divison von Intervallen nicht=
=20
> wohldefiniert ist, wenn Monate und Jahre mit Stunden, Minuten und Sekun=
den=20
> vermischt werden.

Du meinst, weil ein Monat nicht klar definiert ist? Dann dürfte
folgendes aber auch nicht gehen:

test=3D# select '1 month'::interval / 5;
?column?
----------
6 days
(1 row)

Hier wird also ein Monat mit 30 Tagen angenommen, als Konstante.
Dasselbe sollte dann auch mit Intervallen gehen.


Andreas
--=20
Andreas Kretschmer
Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: INTERVAL/INTERVAL-Divisionen

am 30.07.2009 11:12:47 von Albe Laurenz

A. Kretschmer schrieb:
> Hm, mal rein logisch: was soll denn 1 Stunde geteilt durch 5 Minuten
> ergeben?

12, würde ich sagen. Ohne Einheit.

Das Problem tritt erst ab Intervallen mit Monaten drin auf.

Ich würde das Jahr mit 365,25 Tagen ansetzen.

Liebe Grüße,
Laurenz Albe

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: INTERVAL/INTERVAL-Divisionen

am 30.07.2009 11:55:09 von Tim Landscheidt

"Albe Laurenz" wrote:

>> Hm, mal rein logisch: was soll denn 1 Stunde geteilt durch 5 Minuten
>> ergeben?

> 12, würde ich sagen. Ohne Einheit.

> Das Problem tritt erst ab Intervallen mit Monaten drin auf.

> Ich würde das Jahr mit 365,25 Tagen ansetzen.

Das habe ich auch (*1), aber es hätte das Problem hier noch
unnötig verkompliziert :-).

Tim

(*1) Genau genommen natürlich 365,2425 d.


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: INTERVAL/INTERVAL-Divisionen

am 30.07.2009 23:59:36 von Tim Landscheidt

"A. Kretschmer" wrote:

>> 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:

> Hm, mal rein logisch: was soll denn 1 Stunde geteilt durch 5 Minuten
> ergeben? Oder anders, die Umkehrung der Division: sind 5 Sekunden * 10
> Sekunden dann 50 Quadratsekunden?

12. Und: Ja :-). Zumindest der Kehrwert kommt ja beispiels-
weise bei Beschleunigungen/Verzögerungen vor. Allerdings
würde ich ein vollständiges Einheitenhandling eher bei Ma-
thematica oder so erwarten als bei PostgreSQL.

Andererseits wäre es eine interessante Fleißarbeit, Post-
greSQL um Datentypen und Konversionen zu erweitern, damit
man dann Berechnungen =E0 la "100::MILE / (80::KILOMETER /
1::HOUR) * 1::PARSEC / 1::MINUTE" ausführen könnte :-).

> Ich denke mal, Deine Cast-Lösung ist okay und einfacher wird es nicht
> gehen.

Schade.

Tim


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: INTERVAL/INTERVAL-Divisionen

am 31.07.2009 07:08:21 von andreas.kretschmer

In response to Tim Landscheidt :
> "A. Kretschmer" wrote:
>=20
> >> 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:
>=20
> > Hm, mal rein logisch: was soll denn 1 Stunde geteilt durch 5 Minuten
> > ergeben? Oder anders, die Umkehrung der Division: sind 5 Sekunden * 1=
0
> > Sekunden dann 50 Quadratsekunden?
>=20
> 12. Und: Ja :-). Zumindest der Kehrwert kommt ja beispiels-
> weise bei Beschleunigungen/Verzögerungen vor. Allerdings
> würde ich ein vollständiges Einheitenhandling eher bei Ma-
> thematica oder so erwarten als bei PostgreSQL.
>=20
> Andererseits wäre es eine interessante Fleißarbeit, Post-
> greSQL um Datentypen und Konversionen zu erweitern, damit
> man dann Berechnungen =E0 la "100::MILE / (80::KILOMETER /
> 1::HOUR) * 1::PARSEC / 1::MINUTE" ausführen könnte :-).

http://svana.org/kleptog/pgsql/taggedtypes.html


Andreas
--=20
Andreas Kretschmer
Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: INTERVAL/INTERVAL-Divisionen

am 09.08.2009 23:15:30 von Tim Landscheidt

"A. Kretschmer" wrote:

> [...]
>> Andererseits wäre es eine interessante Fleißarbeit, Post-
>> greSQL um Datentypen und Konversionen zu erweitern, damit
>> man dann Berechnungen =E0 la "100::MILE / (80::KILOMETER /
>> 1::HOUR) * 1::PARSEC / 1::MINUTE" ausführen könnte :-).

> http://svana.org/kleptog/pgsql/taggedtypes.html

Hmmm, kompiliert hier nicht; und aus der Beschreibung wird
mir nicht klar, ob man da "USD / EUR" berechnen könnte. Ich
fände da den Ansatz, die verschiedenen Maßeinheiten als
"normale" Datentypen zu implementieren, auch viel durch-
schaubarer.

Tim


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein