【问题标题】:How to get data between range of dates in SQL Server over 1 year combining 2 tables?如何在 1 年内结合 2 个表获取 SQL Server 中日期范围之间的数据?
【发布时间】:2021-12-24 03:03:22
【问题描述】:

有 2 张桌子 -

  1. 包含 order_number、item_number 和 sale_date 详细信息的销售表。
  2. 包含 item_number、promotion_start_date 和 Promotion_end_date 详细信息的促销表。

促销活动贯穿全年,持续几天。 需要在没有促销活动时提取已售商品列表

只需要提取之间的订单号

  • “第一个promotion_end_date”和“第二个promotion_start_date”然后
  • “第二个promotion_end_date”和“第三个promotion_start_date”然后
  • “第三次promotion_end_date”和“第四次promotion_start_date”等等。

示例表如下-

1) Promotions 表:(当promotion_end_date 为“Null”时,promotion 仍为“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) 销售表

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

【问题讨论】:

    标签: sql sql-server date range date-range


    【解决方案1】:

    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 展示了我们如何喜欢查看表结构和示例数据,并且还更正了 9 月 31 日。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多