2016-03-20 10 views
1

Ich bin ein ziemlich unerfahrener SQL-Entwickler, aber ich versuche mein Bestes zu geben, um eine konsistente Datenbank zu haben. Das Problem, das ich lösen möchte, könnte in einer oberen Schicht meines Systems geschehen, aber ich bin mir bewusst, dass es am besten ist, Dinge wie das, wo sie hingehören, zu behandeln: In der Datenbankebene.Wie überprüft man, ob eine bestimmte day_id innerhalb eines bestimmten Zeitintervalls day_from bis day_to enthalten ist?

Also, was ich habe ist eine Tabelle, wo ich Angebote speichern, die auf einem definierten Tag oder wiederholen können nicht:

day_of_week 
--------------------------------------------- 
id day_name 
1 SUNDAY 
2 MONDAY 
3 TUESDAY 
4 WEDNESDAY 
5 THURSDAY 
6 FRIDAY 
7 SATURDAY 

offer 
--------------------------------------------- 
id day_id valid_from_day valid_until_day 
1 3  2016-03-01  2016-03-01 
2 6  2016-03-01  9999-03-01 

und hier ist mein Problem:

offer 
--------------------------------------------- 
id day_id valid_from_day valid_until_day 
1 2  2016-03-01  2016-03-01 
2 6  2016-03-01  9999-03-01 

day_id 2 Marken keinen Sinn für 2016-03-01 bis 2016-03-01, weil der 1. oder März 2016 war ein TUESDAY = 3, kein MONDAY = 2.

Ich möchte beliebige Intervalle in dieser Tabelle speichern können, aber ich muss sicherstellen, dass sie sinnvoll sind. Was ich suche ist eine Möglichkeit zu überprüfen, ob ein gegebenes Intervall valid_from_day zu valid_until_day einen gegebenen Tag day_id enthält. Dies sollte eigentlich eine einfache Überprüfung sein, aber ich bin mir nicht sicher, ob ich dafür einen CONSTRAINT verwenden kann oder ob ich dafür einen TRIGGER verwenden müsste und wie das aussehen würde.

Antwort

0

Ich denke, ein Trigger ist in diesem Fall am besten. Schreiben Sie es so, dass ein UPDATE oder INSERT nur dann erfolgt, wenn day_id zwischen extract(dow from valid_from_day::date) und extract(dow from valid_until_day::date) liegt. Dies sollte natürlich in die Funktionsweise von Triggerfunktionen passen.

Es gibt weitere Variationen, die Sie verwenden können, überprüfen Sie die EXTRACT Funktion.

Verwandte Themen