INTERVAL/INTERVAL-Divisionen

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

--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
Tim Landscheidt [ Do, 30 Juli 2009 02:21 ] [ ID #2010367 ]

Re: INTERVAL/INTERVAL-Divisionen

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? 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.


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

--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
andreas.kretschmer [ Do, 30 Juli 2009 07:48 ] [ ID #2010369 ]

Re: INTERVAL/INTERVAL-Divisionen

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
wohldefiniert ist, wenn Monate und Jahre mit Stunden, Minuten und Sekunden=

vermischt werden.

--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
Peter Eisentraut [ Do, 30 Juli 2009 09:34 ] [ ID #2010370 ]

Re: INTERVAL/INTERVAL-Divisionen

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?
>
> 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=

> wohldefiniert ist, wenn Monate und Jahre mit Stunden, Minuten und Sekun=
den
> 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
--
Andreas Kretschmer
Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header)
GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net

--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
andreas.kretschmer [ Do, 30 Juli 2009 09:59 ] [ ID #2010371 ]

Re: INTERVAL/INTERVAL-Divisionen

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

--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
Albe Laurenz [ Do, 30 Juli 2009 11:12 ] [ ID #2010373 ]

Re: INTERVAL/INTERVAL-Divisionen

"Albe Laurenz" <laurenz.albe [at] wien.gv.at> 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.


--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
Tim Landscheidt [ Do, 30 Juli 2009 11:55 ] [ ID #2010374 ]

Re: INTERVAL/INTERVAL-Divisionen

"A. Kretschmer" <andreas.kretschmer [at] schollglas.com> 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


--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
Tim Landscheidt [ Do, 30 Juli 2009 23:59 ] [ ID #2010375 ]

Re: INTERVAL/INTERVAL-Divisionen

In response to Tim Landscheidt :
> "A. Kretschmer" <andreas.kretschmer [at] schollglas.com> 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 * 1=
0
> > 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 :-).

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


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

--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
andreas.kretschmer [ Fr, 31 Juli 2009 07:08 ] [ ID #2010450 ]

Re: INTERVAL/INTERVAL-Divisionen

"A. Kretschmer" <andreas.kretschmer [at] schollglas.com> 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


--
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein [at] postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein
Tim Landscheidt [ So, 09 August 2009 23:15 ] [ ID #2011539 ]
Datenbanken » gmane.comp.db.postgresql.german » INTERVAL/INTERVAL-Divisionen

Vorheriges Thema: == WöchentlicherPostgreSQL Newsletter - 09.August 2009
Nächstes Thema: == WöchentlicherPostgreSQL Newsletter - 02.August 2009