需要SQL帮助来计算商店是否开放

时间:2010-01-11 15:17:45

标签: sql

我在“Stores”表中有一个商店代码列表,另一个表“StoreClosedDates”告诉我商店是否在周六或周日关闭。我的StoreOpenDates表如下所示:

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

此表需要稍后更改以包括假日日期,以便也可以涵盖这些日期。我并不完全确定如何更改此表以涵盖两个选项(假期和周末)。现在我需要编写一个查询,它返回一个为当前日期打开的商店列表。我不知道如何比较where子句中的周末 - 我知道我应该使用:DATEPART(dw,getdate()),但我似乎无法看到整个图片来解决它。

StoreClosedDates仅包含已关闭的商店。如果该表中没有商店,则商店将在当前日期打开。

3 个答案:

答案 0 :(得分: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())
        )

答案 1 :(得分:0)

是否需要在该表中?将假期存储在一个单独的表中,您可以加入以获得所需的功能。

答案 2 :(得分: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,这也取决于你所设定的“一周的第一天”