2010-01-11 5 views
2

J'ai une liste de storecodes dans la table "Stores" et une autre table "StoreClosedDates" qui me dit si le magasin est fermé un samedi ou un dimanche. Ma table StoreOpenDates ressemble à ceci:Besoin d'aide avec SQL pour calculer si le magasin est ouvert ou non

CREATE TABLE [dbo].[StoreClosedDates](
    [StoreCode] [varchar](50) NOT NULL, 
    [ClosedOnSunday] [bit] NOT NULL, 
    [ClosedOnSaturday] [bit] NOT NULL 
) ON [PRIMARY] 

Ce tableau doit être changé plus tard pour inclure les dates de vacances et, de sorte que ceux-ci peuvent être couverts. Je ne suis pas tout à fait sûr comment je peux changer cette table pour couvrir les deux options (vacances et week-ends). Maintenant, j'ai besoin d'écrire une requête qui me renvoie une liste de magasins ouverts pour la date actuelle. Je ne suis pas sûr comment comparer pour le week-end dans la clause where - je sais que je devrais employer: DATEPART (dw, getdate()), mais je ne peux pas sembler voir l'image entière pour la résoudre.

Le StoreClosedDates contient uniquement les magasins fermés. Si un magasin n'est pas présent dans cette table, le magasin est ouvert pour la date actuelle.

Répondre

1
SELECT * 
FROM StoreClosedDates 
WHERE NOT (DATEDIFF(day, GETDATE(), '2007/01/01') % 7 = 5 AND ClosedOnSaturday = 1) 
     AND NOT (DATEDIFF(day, GETDATE(), '2007/01/01') % 7 = 6 AND ClosedOnSunday = 1) 

Mieux éviter l'utilisation de DATEPART, parce qu'il est dépendant de l'environnement local.

Pour vérifier les vacances à date fixe, créez une table avec deux colonnes distinctes contenant le mois et la date:

CREATE TABLE holiday (
     hmon TINYINT, hday TINYINT, 
     PRIMARY KEY (hmon, hday), 
     CHECK(CAST('2008-' + CAST(hday AS VARCHAR) + '-' + CAST(hmon AS VARCHAR) AS DATETIME) > 0) 
     ) 

et de l'utiliser dans une requête:

SELECT * 
FROM Stores 
WHERE id NOT IN 
     (
     SELECT StoreID 
     FROM StoreClosedDates 
     WHERE NOT (DATEDIFF(day, GETDATE(), '2007/01/01') % 7 = 5 AND ClosedOnSaturday = 1) 
       AND NOT (DATEDIFF(day, GETDATE(), '2007/01/01') % 7 = 6 AND ClosedOnSunday = 1) 
     ) 
     AND NOT EXISTS 
     (
     SELECT NULL 
     FROM Holidays 
     WHERE hday = DAY(GETDATE()) 
       AND hmon = MONTH(GETDATE()) 
     ) 
+0

Merci. Comment pourrais-je étendre cela pour filtrer les vacances aussi? – vikasde

+0

La partie GetDate() ne devrait-elle pas être annulée avec la date codée à la main? – vikasde

+0

Merci. Pouvez-vous s'il vous plaît expliquer pourquoi vous codez manuellement 2008 dans le chèque? – vikasde

0

Faut-il être dans cette table? Rangez les vacances dans un tableau séparé et vous pouvez rejoindre pour obtenir la fonctionnalité dont vous avez besoin.

+0

Non, pas nécessairement. Je peux ajouter les vacances dans une table séparée. – vikasde

0
SELECT * FROM Stores WHERE StoreCode NOT IN 
(
    SELECT StoreCode FROM StoreClosedDates 
    WHERE 
    (
     DATEPART (dw , getdate()) = 1 AND ClosedOnSunday = 1 
    ) OR 
    (
     DATEPART (dw , getdate()) = 7 AND ClosedOnSaturday = 1 
    ) 
) 

Cela suppose que votre appel DatePart renvoie 1 pour le dimanche (premier jour de la semaine) et 7 pour le samedi. Je peux me tromper là-dessus, peut-être ses 0 et 6, et cela dépend aussi de ce que vous avez défini comme votre "premier jour de la semaine"

Questions connexes