Range_Diff

Kampfgummibaerlie

Datenbank-Guru
Beiträge
743
LÖSUNG STEHT DARIN !

Ich würde gerne eine Function schreiben, welche allgemein einsetzbar ist, sprich, egal welche Range ich einsetzen würde (Typ Time_Range, Typ Date_Range oder Typ Timestamp_Range)

Also, mir ist klar, dass man dazu wiederum weitere 3 Funktionen schreiben muss, aber ich hätte gerne eine Basis-Funktion, welche für ein jede Range_Diff-Berechnung gleich bleibt.

Weil ich kämpfe damit, Upper(x) - lower(x) in eine Funktion zu bringen.

der Wert x ist ein Wert des Typs Range (welche auch immer), und irgendwie schaffe ich es nicht, eine doch so simple (?) Funktion zu schreiben.

Meine überlegung wäre, dass man einfach neue Range_Diff-Berechnungen anlegt, indem man eben diese eine Basis-Berechnung abfragt.

Falls das unmöglich/nicht sinnvoll/oder sonst etwas ist, aktzeptiere ich das gerne, aber selbst wenn das nicht umgesetzt werden würde, würde mich interessieren, wie man in einer Funktion mit upper und lower arbeiten könnte.

Nach kurzem herumdenken/probieren, draufgekommen, wies geht ;)

create Function:
CREATE FUNCTION timestamp_subtype_diff(x timestamprange) RETURNS float8 AS 'SELECT EXTRACT(EPOCH FROM (upper(x)-lower(x)))' LANGUAGE sql STRICT IMMUTABLE;

test Function:
select timestamp_subtype_diff('1.1.17 08:00', '1.1.17 09:00')

Ergebniss:
-3600
 
Werbung:
Problem dabei wäre nur, dass der Wert eben negativ ist, mit welchem sich schwierig/ungerne weiterrechnen lässt.
Kam in den 20 Minuten seit posten des Hauptthreads nicht auf eine Lösung, multiplizieren mit -1 geht nicht.
oder ist das garkein negativer Wert, nur er schreibt halt so ein - hin, damit man keine 999 davor schreiben kann? xD
 
Du solltest nicht versuchen, vorhandene Dinge noch einmal zu erfinden. Deine Werte, die Du der Funktion übergibst, sehen schon falsch aus. '1.1.17' ist kein valides Datum, Zeitangaben sind z.. 08:06:12 (Stunde:Minute:Sekunde).

Code:
test=# CREATE FUNCTION ts_diff(x tsrange) RETURNS float8 AS 'SELECT EXTRACT(EPOCH FROM (upper(x)-lower(x)))' LANGUAGE sql STRICT IMMUTABLE;
CREATE FUNCTION
test=*# select ts_diff('[2017-01-01 08:00:00, 2017-01-01 09:00:00)');
 ts_diff
---------
  3600
(1 Zeile)
 
Werbung:
Code:
test = # CREATE FUNCTION ts_diff2(x tsrange) RETURNS float8 AS 'SELECT EXTRACT(EPOCH FROM (upper(x)-lower(x)))' LANGUAGE sql STRICT IMMUTABLE;
------------------------------------------
test =*# select ts_diff2('[1.1.17 08:00, 1.1.17 09:00)');
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
3600

funktioniert genauso, wie deine Lösungsvariante.
Vielleicht kenne ich das garnicht anders, weil ichs immer so eingegeben habe, und teilweise (weils für mich eher zu verstehen ist) ich die codes von dir ein wenig "umdenke".

Meine Methode funktioniert auch, aber ich habe es bisher immer per der europäischen (?) Variante gemacht: '1.1.17'
 
Zurück
Oben