Kampfgummibaerlie
Datenbank-Guru
- Beiträge
- 743
Bin heute draufgekommen, dass man ebenfalls den Rückgabetyp "Table" wählen muss, wenn eine Funktion mehrere Zeilen antworten soll/können soll.
Mein Beispiel sieht so aus:
Dachte vorher, dass ein spezifischer Rückgabetyp nur eine Column wiedergeben kann, aber ja, man lernt ja nie aus
ANHANG HIER: ich verwende hier einen Typ timerange, welcher nicht von haus aus bei den Typen von Postgresql dabei ist.
Hier eine vollständige Anleitung, wie es funktioniert:
Um hier ersteinmal den Subtype für den Typ Timerange zu definieren:
Um hier ersteinmal den Typ Timerange zu definieren:
Um hier eine Tabelle mit Öffnungszeiten zu erstellen:
Um hier 2 Öffnungszeiten am selben Wochentag einzufügen:
1.:
2.:
Um hier eine Function zu erstellen, welche aus einem Datum den Wochentag berechnet:
Um hier eine Function zu erstellen, welche die Öffnungszeiten aus einem Datum angelt:
Und hier, um das Ganze auch auszuprobieren:
Ergebnis:
08:00-14:00 und 16:00-20:00
Mein Beispiel sieht so aus:
Code:
create or replace function oeffnungszeit_datum(x date) returns table (oeffnungszeit timerange) as $$ select oeffnungszeit from oeffnungszeiten where tages_id = wochentag_datum(x) $$ language sql;
Dachte vorher, dass ein spezifischer Rückgabetyp nur eine Column wiedergeben kann, aber ja, man lernt ja nie aus
ANHANG HIER: ich verwende hier einen Typ timerange, welcher nicht von haus aus bei den Typen von Postgresql dabei ist.
Hier eine vollständige Anleitung, wie es funktioniert:
Um hier ersteinmal den Subtype für den Typ Timerange zu definieren:
Code:
CREATE FUNCTION time_subtype_diff(x time, y time) RETURNS float8 AS 'SELECT EXTRACT(EPOCH FROM (x - y))' LANGUAGE sql STRICT IMMUTABLE;
Um hier ersteinmal den Typ Timerange zu definieren:
Code:
CREATE TYPE timerange AS RANGE (subtype = time, subtype_diff = time_subtype_diff);
Um hier eine Tabelle mit Öffnungszeiten zu erstellen:
Code:
create table Oeffnungszeiten (Oeffnungszeit timerange, wochentag integer);
Um hier 2 Öffnungszeiten am selben Wochentag einzufügen:
1.:
Code:
insert into oeffnungszeiten (oeffnungszeit, wochentag) values ('(08:00, 14:00)', '1')
2.:
Code:
insert into oeffnungszeiten (oeffnungszeit, wochentag) values ('(16:00, 20:00)', '1')
Um hier eine Function zu erstellen, welche aus einem Datum den Wochentag berechnet:
Code:
CREATE FUNCTION wochentag_datum (x date) RETURNS double precision AS 'select extract(dow from x)' LANGUAGE sql STRICT IMMUTABLE;
Um hier eine Function zu erstellen, welche die Öffnungszeiten aus einem Datum angelt:
Code:
create or replace function oeffnungszeit_datum(x date) returns table (oeffnungszeit timerange) as $$ select oeffnungszeit from oeffnungszeiten where wochentag=wochentag_datum(x) $$ language sql;
Und hier, um das Ganze auch auszuprobieren:
Code:
select oeffnungszeit_datum('2017.07.03')
Ergebnis:
08:00-14:00 und 16:00-20:00