如何获取 SQL 服务器超过 1 年的日期范围内的数据并结合 2 个表?

How to get data between range of dates in SQL Server over 1 year combining 2 tables?

有2个table-

  1. 销售额 table,详细信息为 order_number、item_number 和 sale_date。
  2. 促销活动 table,包含 item_number、promotion_start_date 和 promotion_end_date 的详细信息。

促销活动 运行 全年在一定天数内进行。 需要在运行宁.

没有促销时提取已售商品列表

只需要提取

之间的订单号

样本table如下-

1) 促销 table : ( 当 promotion_end_date 为 'Null' 时,促销仍为 'ACTIVE')

item_number promotion_start_date promotion_end_date
ABC0001 12-31-2020 01-19-2021
ABC0001 03-01-2021 03-31-2021
ABC0005 02-05-2021 03-01-2021
ABC0002 06-01-2021 07-31-2021
ABC0001 09-31-2021 11-05-2021
ABC0001 11-08-2021 Nil

2) 销售额 Table :

order_number item_number sale_date
110000011 ABC0001 01-18-2021
110000012 ABC0001 01-31-2021
110000013 ABC0002 06-30-2021
110000014 ABC0001 07-31-2021
110000015 ABC0005 04-05-2021
110000016 ABC0001 10-05-2021
110000017 ABC0001 12-01-2021
110000018 ABC0002 08-30-2021
110000019 ABC0001 04-01-2021
110000020 ABC0001 07-30-2021
110000021 ABC0005 02-28-2021
110000022 ABC0001 11-06-2021

3) 预期结果:

order_number item_number sale_date
110000012 ABC0001 01-31-2021
110000014 ABC0001 07-31-2021
110000015 ABC0005 04-05-2021
110000017 ABC0001 12-01-2021
110000018 ABC0002 08-30-2021
110000019 ABC0001 04-01-2021
110000020 ABC0001 07-30-2021
110000022 ABC0001 11-06-2021

many ways to solve this kind of problem但我一般更喜欢NOT EXISTS:

SELECT order_number, item_number, sale_date
FROM dbo.Sales AS s
WHERE NOT EXISTS 
(
  SELECT 1 
    FROM dbo.Promotions AS p
    WHERE s.item_number = p.item_number
    AND s.sale_date >= p.promotion_start_date
    AND s.sale_date <= COALESCE(p.promotion_end_date, GETDATE())
);

我认为这里最棘手的部分是在促销进行时用有效时间点替换结束日期。

  • 示例 db<>fiddle 展示了我们多么喜欢看到 table 结构和示例数据,并且还更正了 9 月 31 日。