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

标签 sql sql-server t-sql 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

...这样的例子还在继续。 我需要根据以下条件从 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/

相关文章:

mysql - 查找所有丢失的映射表条目

php - 关于sql选择和print_r数组的问题

java - 如何检查结果集是否为空

mysql - 优化 MySQL 的重复查询

sql - 如何防止内部选择表达式中的 SQL Server 错误(使用 'IN' 和 'EXISTS' 关键字)

SQL 表性能 - 大表

php - 基于 Linux 的 PHP 安装连接到 MsSQL Server

sql - 通过删除绝对路径并保留文件名来更新数据库列

t-sql - TSQL 游标替代方案可加快查询速度

sql - 从两个表到单个 View 的 T-SQL 层次结构