2014-09-04 245 views
0

我正在进行酒店房间预订项目。我有一张桌子,我在其中创建折扣促销。在此表中,我有PromotionStartDatePromotionEndDate。例如,我有一个从03-aug-14 to 07-Aug-14开始的促销活动。如果一个人从1-Aug-14 to 10-Aug-14搜索房间的可用性,所以查询应该显示折扣将适用于8月3,4,5,6和7的结果。 我想要的结果应该是这样的:SQL Server日期范围

Dates  :  DiscountStatus 
01-Aug-14 :   No 
02-Aug-14 :   No 
03-Aug-14 :   Yes 
04-Aug-14 :   Yes 
05-Aug-14 :   Yes 
06-Aug-14 :   Yes 
07-Aug-14 :   Yes 
09-Aug-14 :   No 
10-Aug-14 :   No 
+0

你有一个日历表? – 2014-09-04 11:03:05

+0

您使用的是什么SQL版本? – abramlimpin 2014-09-04 11:20:42

回答

3

您可以试试这个查询。这个想法是在预订开始日期和结束日期之间生成一系列日期。然后检查每个日期是否在促销日期范围内。

DECLARE @startDate Datetime = '2014-08-01' -- search start date 
DECLARE @endDate DateTime = '2014-08-01' -- search end date 
;WITH Dates([Date]) --Generate sequence of dates 
AS 
(
    SELECT @startDate 
    UNION ALL 
    SELECT DATEADD(DD,1,Dates.[Date]) 
    FROM Dates 
    WHERE Dates.[Date] < @endDate 
) 
SELECT [Date],CASE WHEN Promotion.PromotionStartDate IS NULL THEN 'No' 
        ELSE 'Yes' END AS DiscountStatus 
FROM Dates LEFT JOIN Promotion 
     ON Dates.Date BETWEEN Promotion.PromotionStartDate 
     AND Promotion.PromotionEndDate; 
GO 
0
SELECT PromotionStarDate, CASE WHEN PromotionStarDate 
BETWEEN '2014-08-03' AND '2014-08-07' 
THEN 'Yes' ELSE 'No'END AS DiscountStatus 
FROM table_name