2016-03-20 1 views
1

Je suis un développeur SQL plutôt inexpérimenté mais j'essaie de faire de mon mieux pour avoir une base de données cohérente. Le problème que je cherche à résoudre pourrait être résolu dans une couche supérieure de mon système, mais je suis conscient qu'il est préférable de gérer des choses comme celles-ci où elles appartiennent: Dans la couche de base de données.Comment vérifier si un certain day_id est contenu dans un intervalle de temps donné day_from to day_to?

Donc ce que j'ai est une table où je stocke des offres qui peuvent ou ne peuvent pas répéter un jour défini:

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 

et voici mon problème:

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 marques aucun sens pour 2016-03-01 à 2016-03-01 parce que le 1er ou Mars, 2016 était un TUESDAY = 3, pas un MONDAY = 2. Je veux être capable de stocker des intervalles arbitraires dans cette table mais je dois m'assurer qu'ils ont un sens. Ce que je cherche est un moyen de vérifier si un intervalle donné valid_from_day à valid_until_day contient un jour donné day_id. Cela devrait effectivement être une vérification facile, mais je ne suis pas sûr si je peux utiliser un CONSTRAINT pour cela ou si je devrais utiliser un TRIGGER pour cela et à quoi cela ressemblerait.

Répondre

0

Je pense qu'un déclencheur est le meilleur dans ce cas. Écrivez-le de sorte qu'une UPDATE ou INSERT soit effectuée seulement si day_id est entre extract(dow from valid_from_day::date) et extract(dow from valid_until_day::date). Cela devrait s'inscrire naturellement dans le fonctionnement des fonctions de déclenchement.

Il existe d'autres variantes que vous pouvez utiliser, vérifiez la fonction EXTRACT.