我在“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仅包含已关闭的商店。如果该表中没有商店,则商店将在当前日期打开。
答案 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,这也取决于你所设定的“一周的第一天”