Keine Sonn und Feiertage

Kampfgummibaerlie

Datenbank-Guru
Beiträge
735
Nachdem ich nach jüngsten Erfahrungen, eine neue Idee hätte, hier mein Einfall:

1.: Ich erstelle eine Function, welche den Wochentag zu einem Datum berechnet.
1.1.: Mein Code dafür:
Code:
CREATE FUNCTION wochentag_datum (x date) RETURNS double precision AS 'select extract(dow from x)' LANGUAGE sql STRICT IMMUTABLE;

2.: Ich erstelle eine Function, welche alle Feiertagsdaten aus der Tabelle Feiertage auflistet.
2.1.: Hier bin ich noch am werkeln, aber ich denke mir, dass eine solche Function nicht das Problem sein sollte, habe ehrlich gesagt mehr Sorgen zwecks des 3. Punktes ^^ Meine Überlegung hier wäre enfach nur ein select * from Feiertage

3.: Ich erstelle einen Check, welcher die beiden zuvorkommenden Functions abruft, und das Ganze prüft, ob das Datum möglich ist. Da ich (noch immer) ein Neuling auf dem Gebiet bin, und das werde ich wohl auch noch lange bleiben, (und ja, ich weiß, dass man in einer Constraint "einfach" Functions abrufen kann), ob so etwas möglich ist.
3.1.: Einen Check Constraint erstellen, welcher sowohl die Funktion 1 prüft, und auch die Function 2, ob dieser zutrifft, oder nicht, mein Gedanke wäre hier mittels eines boolean-Feldes, überprüfen, ob das Datum != dem eingegebenem Datum ist, und dann aber auch noch, ob dieser Tag eben >kein< Sonntag ist.

Bin mal wieder unterwegs ;) wir lesen uns aber wohl heute Abend, möchte nur all meine Ideen hier veröffentlichen, falls es andere interessiert.
 
Werbung:
Nach einer Weile daran arbeiten, und herumprobieren, war garnicht so schwer, sage ich mal:

Sonn- und Feier-Tage nicht einfügbar machen: (Komplettes Beispiel)

Create Table/s:

Tabelle für Feiertage:
Code:
1.: Create Table Feiertage (Feiertags_ID serial unique, Feiertags_Name text, Feiertags_Datum date, Primary Key(Feiertags_ID));

Tabelle für Vermietungen:
Code:
create table vermietungen (Vermietungs_ID serial unique primary key, Mietungsdatum date);

Function für Wochentag von Datum:
Code:
CREATE FUNCTION wochentag_datum (x date) RETURNS double precision AS 'select extract(dow from x)' LANGUAGE sql STRICT IMMUTABLE

Check-Constraint, um Sonntage auszuschließen:
Code:
ALTER TABLE vermietungen ADD CONSTRAINT keine_Sonntage CHECK (wochentag_datum(Mietungsdatum)>0);

Function um alle Feiertagsdaten zu wählen:
Code:
CREATE FUNCTION Feiertagsdaten (x date) RETURNS Date AS 'select Feiertags_Datum from Feiertage)' LANGUAGE sql STRICT IMMUTABLE;

Check-Constraint, um Feiertage auszuschließen:
Code:
ALTER TABLE vermietungen ADD CONSTRAINT keine_Feiertage CHECK (Mietungsdatum != Feiertagsdaten(Mietungsdatum));

Insert-Beispiele (benötigt für Test):
1.: Insert-Beispiel
INSERT INTO public.feiertage(feiertags_datum) VALUES ('2017.12.24');

Tests:
1.: Insert-Test
Code:
INSERT INTO public.vermietungen(mietungsdatum) VALUES ('2017.12.24');

Error:
ERROR: new row for relation "vermietungen" violates check constraint "keine_feiertage"
DETAIL: Failing row contains (1, 2017-12-24).
********** Error **********

2.: Insert-Test
Code:
INSERT INTO public.vermietungen(mietungsdatum) VALUES ('2017.06.11');

Error:
ERROR: new row for relation "vermietungen" violates check constraint "keine_sonntage"
DETAIL: Failing row contains (2, 2017-06-11).
********** Error **********

EDIT: Wielange wird das Forum/die Threads hier "lebendig" gehalten? Also, ich meine nicht, wegen closen oder so, eher, wielange die hier im Forum stehen bleiben.

EDIT2: Habe vergessen, ein Insert-Beispiel zu nennen, welches funktioniert:
3. Insert-Test
Code:
INSERT INTO public.vermietungen(mietungsdatum) VALUES ('2017.06.12');

Dieser Insert funktioniert ;)
 
Kleiner Hinweis: Funktionen, die als IMMUTABLE definiert sind, müssen unter allen Umständen immer dasselbe Resultat für dieselben Eingabeparameter liefern. Also z.B. Eine Funktion, die die dritte Potenz einer Zahl liefert, erfüllt dies. Deine als IMMUTABLE definierten Funktionen schauen aber in anderen Tabellen nach und je nachdem, was da drin steht, liefern sie unterschiedliche Ergebnisse. IMMUTABLE ist daher falsch, das führt zu Fehlern. VOLATILE als der Default wäre hier richtig.

Das hat z.B. Auswirkungen darauf, welche Funktionen Du in Constraints und Indexen für funktionale Indexe verwenden kannst - und welche nicht.
 
Ich komme nicht ganz nach, glaube ich, aber ja, ich hätte so gearbeitet, dass Ostern/Weihnachten/etc. von ein jedem Jahr darin steht, was ich von dir aber so lese, glaube ich, würdest du wenn dort steht "Weihnachten", das Datum entsprechend ändern, welches darin steht? :/

Würde arbeiten, dass 24.12.2017 und 24.12. 2018 und 24.12.2019 drinnen steht, sprich der Wert gleich bleiben würde(?)

EDIT: Index ist mir (noch hoffe ich xD) ein Fremdwort :X
 
Wenn Du Dir nicht sicher bist, ob der 24.12.2017 gleich dem 24.12.2018 ist, kannst Du das einfach prüfen:

Code:
test=*# select '24.12.2017'::date = '24.12.2019'::date;
 ?column?
----------
 f
(1 Zeile)

f steht für 'false'.
 
Ich meine es eher so:
In Tabelle 1 steht 24.12.2018 und 24.12.2019

über die Funktionen vergleiche ich, ob das eingetragene Datum ungleich einem von den entsprechenden Feiertagen ist.

Und der 24.12.2018, bzw. 24.12.2019 ist ein Ist-Wert, sprich der wird nie geändert, sondern bleibt "ewig" da drinnen ^^

Oder kann man das irgendwie auch regeln, dass der 24.12. in ein jedem Jahr "gesperrt" ist, ich denke, irgendwie möglich mittels Interval, oder so :/

Nächster Kaffee :X
 
Ich denke, es ist vielleicht machbar, in einer Funktion ds zu machen, und nicht die Feiertage fest in einer Tabelle zu speichern. Das ginge prinzipiell auch für Ostern etc., dafür gibt es Formeln.

Das Problem an Deiner Lösung ist: Du hast heute z.B. noch nicht den 24.12.2087 eingetragen, ein Aufruf heute mit diesem Datum bringt daher ein anderes Resultat als in 70 Jahren, wenn Du hoffentlich dran gedacht hast, Weihnachten 2087 noch einzutragen.
 
naja, dass mit 2087 ist wieder eine andere Sache, ich hätte eher einen Constraint zusätzlich noch eingebaut, dass man nicht mehr als 100 Tage im vorhinein mieten kann.

und ich würde entsprechend jedes Jahr die Feiertage vom Übernächsem Jahr nachtragen.

Aber, wenn ich mal schnell fragen darf (Ich weiß zwar, dass es Interval gibt, aber nicht wirklich den nötigen Bezug dazu):
Wie würde ein solcher aussehen? (Ja, ich werde Googeln, bzw. das Forum durchsuchen)
Kann man da angeben, dass Jahr vom Current_Date und entsprechend die Feiertage nicht verfügbar sind (die fixen)?
Andererseits müsste ich mich (wieder) über die Gaußens-Formel informieren ;)
 
Nachdem ich ja brav zuhöre, jedoch am umsetzen scheitere, hier meine Idee:

Ich fische mir aus dem current_date entsprechend das Jahr mittels einer Function (YoD nennen wirs mal)
Ich vergleiche mittels einer Funktion die Daten mit einem selbst "erstellten" Datum, so in der Art; date(24.12.YoD)

Will jedoch nicht wirklich klappen, habe es in beiden Varianten probiert "24.12.YoD" und "YoD.12.24"

Schwesterlein meinte nur gerade, ich sollte mal nach convert suchen, aber eine andere Idee, wie ich die Feiertage in ein jedem Jahr ausschließe kam mir bisher nicht durch den Kopf.
Oder muss ich einfach nur das eingetragene Datum aufs Format "DD-MM" convertieren, und das Jahr rauslassen, und den 24.12. halt eben nicht möglich machen?
 
Das funktioniert (sofern man es richtig macht) nur für Weihnachten, Silvester, Neujahr. Nicht für Ostern, Pfingsten, Himmelfahrt.
 
Wir haben hier in Österreich ein paar mehr "fixe" Feiertage, aber ja, verstehe schon, was du meinst ;)

Wenn ich die fixen Feiertage mal rausgedeckelt habe, kümmere ich mich gerne um die Geschchte mit Ostern ^^
 
die Osterformel in pl/pgsql zu schreiben ist eine nette Übungsaufgabe ;-)

Verfasse ich gerne in ein Buch mit Lösungsbuch (extra Erwerbbar xD)

nein, werde mich wohl erst heute Abend hinter die beiden Dinge setzen, brauche eine gewisse Entspannphase vom konzentrierten programmieren ^^

Oder sollte ich einen Extra-Thread machen, wo die Aufgabe Stück für Stück gelöst wird, auch durch mitarbeiten/Ideen von anderen hier?
 
Werbung:
Zurück
Oben