我使用的是 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
...这样的例子还在继续。 我需要根据以下条件从 ReservationStayDate 表中提取数据(这是 Excel 文件中的表):
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 个 PromoName 及其各自的日期标准。这里的逻辑是,ReservationStayDate 表中 BookingDate 在“2016-01-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 表中提到的每个 PromoName 的数据真的很乏味。
我希望能够将我的 PromoName 表与 ReservationStayDate 表连接起来,但我对如何连接以及如何编写满足我所需输出的 T-SQL 逻辑感到困惑。
假设:PromoNames 和 StayDates 之间没有重叠的日期。
关于如何实现这一目标有什么想法吗?
最佳答案
我认为你可以通过使用 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
关于sql - 如何在我的 T-SQL 查询中传递有关日期的逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40903722/