如何在我的T-SQL查询中传递关于日期的逻辑?

时间:2016-12-01 06:10:12

标签: sql sql-server tsql date join

我正在使用SQL Server 2014.我的数据库中有一个名为' ReservationStayDate'的表(大约100万条记录)。提取物如下所示:

ResaID   StayDate      BookingDate
 253     2016-02-10    2016-01-15
 253     2016-02-11    2016-01-15
 253     2016-02-12    2016-01-15
 321     2016-05-03    2016-02-21
 321     2016-05-04    2016-02-21

...然后列表继续。 我需要根据下面的条件(这是Excel文件中的表)从ReservationStayDate表中提取数据:

PromoName   BookingDateStart  BookingDateEnd  StayDateStart   StayDateEnd
Promo1      2016-01-10        2016-01-30      2016-02-08      2016-02-15
Promo2      2016-03-04        2016-04-30      2016-06-01      2016-06-14
Promo3      2016-03-06        2016-04-20      2016-06-20      2016-06-27

...并且列表中包含大约100个PromoNames及其各自的日期标准。这里的逻辑是ReservationStayDate表WHERE BookingDate中的所有记录都在'之间。 2016年1月10日'和' 2016-01-30'和StayDate介于< 2016-02-08'和' 2016-02-15'将被标记为' Promo1'。

我已将此Excel文件以原始格式导出到我的SQL Server数据库中的表(称为PromoName)。

我正在寻找的输出如下:

ResaID    MinStayDate    MaxStayDate   BookingDate    PromoName
253        2016-02-10    2016-02-12    2016-01-15     Promo1
321        2016-05-03    2016-05-04    2016-02-21     NULL

......等等。 如果ResaID不属于PrmoName表中每个PromoName所提到的标准,则该ResaID的输出将在T-SQL输出的PromoName列下显示NULL(如上面ResaID 321所示)。 每次修改我的T-SQL查询以提取PromoName表中提到的每个PromoNames的数据都非常繁琐。

我希望能够使用ReservationStayDate表加入我的PromoName表,但我对如何连接以及如何编写符合我所需输出的T-SQL逻辑感到困惑。

假设:PromoNames与StayDates之间没有重叠日期。

关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:3)

我认为你可以通过使用LEFT JOIN和GROUP BY实现这一点:

create table #ReservationStayDate(ResaID int,  StayDate date,     BookingDate date)

insert into #ReservationStayDate values
 (253,     '2016-02-10',    '2016-01-15'),
 (253,     '2016-02-11',    '2016-01-15'),
 (253,     '2016-02-12',    '2016-01-15'),
 (321,     '2016-05-03',    '2016-02-21'),
 (321,     '2016-05-04',    '2016-02-21')

create table #PromoName(
    PromoName varchar(50),   
    BookingDateStart date,  
    BookingDateEnd date,  
    StayDateStart date,   
    StayDateEnd date)

insert into #PromoName values
('Promo1','2016-01-10','2016-01-30','2016-02-08','2016-02-15')

select a.ResaID, 
    min(a.StayDate) MinStayDate, 
    max(a.StayDate) MaxStayDate, 
    a.BookingDate BookingDate, 
    b.PromoName
from #ReservationStayDate a
left join #PromoName b on a.BookingDate 
                                  between b.BookingDateStart and b.BookingDateEnd
and a.StayDate between b.StayDateStart and b.StayDateEnd
group by a.ResaID, a.BookingDate, b.PromoName

答案 1 :(得分:0)

SELECT ResaID,MIN(StayDate) MINStayDate,MAX(StayDate)   
MAXStayDate,BookingDate,A.PromoName
FROM ReservationStayDate
LEFT OUTER JOIN
(
  SELECT PromoName,BookingDateStart,BookingDateEnd
  FROM PromoName
)A ON BookingDate BETWEEN BookingDateStart AND BookingDateEnd
GROUP BY ResaID,BookingDate,PromoName