2010-01-11 93 views
2

我有一個商店列表「商店」和另一個表「StoreClosedDates」告訴我,如果商店在週六或週日關閉。我StoreOpenDates表看起來像這樣:需要SQL幫助來計算商店是否打開

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

這表需要後來改爲包括節日日期還有,讓那些可以覆蓋爲好。我並不完全確定如何改變這張桌子來覆蓋這兩個選項(假期和週末)。現在我需要編寫一個查詢,該查詢返回當前日期打開的商店列表。我不知道如何在where子句中比較週末 - 我知道我應該使用:DATEPART(dw,getdate()),但我似乎無法看到整個圖片來解決它。

StoreClosedDates僅包含已關閉的商店。如果商店不在該表中,則商店在當前日期開放。

回答

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) 

更好地避免使用DATEPART,因爲它取決於語言環境。

要檢查是否有固定的日期假期,創建一個表包含月份和日期兩個單獨列:

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) 
     ) 

,並在查詢中使用它:

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

謝謝。我怎樣才能延長這個過濾假期呢? – vikasde 2010-01-11 15:30:41

+0

不應該GetDate()部分與手動編碼日期相反嗎? – vikasde 2010-01-11 15:42:35

+0

謝謝。你能解釋一下爲什麼你在支票上手工編碼2008? – vikasde 2010-01-11 15:58:21

0

是否需要在該表中?將假期存儲在單獨的表格中,您可以加入以獲得所需的功能。

+0

不,不一定。我可以將假期添加到單獨的表格中。 – vikasde 2010-01-11 15:31:22

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 
    ) 
) 

這假設您的DatePart調用在星期日(星期幾的第一天)返回1,星期六則返回7。我可能是錯的,可能是0和6,也取決於你設定的「星期幾」