首页 > 解决方案 > 基于日期范围连接的填充数据库

问题描述

我有一个日期设置为每个月的第一天的数据集。例如 -

单位 日期
32 2021-01-01
37 2021-02-01
47 2021-03-01

我需要在这张桌子上加入这个:

开始日期 结束日期
2021-01-30 2021-02-12
2021-02-13 2021-02-26
2021-02-27 2021-03-12

现在通常我会正确加入这个条款 -

WHERE DATE BETWEEN START DATE AND END DATE

...它工作正常,日期为 2021-02-01。这介于 2021 年 1 月 30 日和 2021 年 2 月 12 日之间。

同样,2021-03-01 日期介于 2021-02-27 和 2021-03-12 之间

然而!我得到开始日期为 2021 年 2 月 13 日和结束日期为 2021 年 2 月 26 日的支付期的空值。我也希望为该行填充表 A 中 2 月份的日期。

我希望表 A 中的数据,对于 2 月(2020 年 2 月 1 日)为 37 个单位,有两行,一行与开始日期 2021-01-30 和结束日期 2021-02-12 连接,另一行连接开始日期为 2021 年 2 月 13 日,结束日期为 2021 年 2 月 26 日。(因为两个支付期都在二月)。结果数据集应如下所示 -

单位 日期 开始日期 结束日期
32 2021-01-01 2021-01-15 2021-01-29
37 2021-02-01 2021-01-30 2021-02-12
37 2021-02-01 2021-02-13 2021-02-26
47 2021-03-01 2021-02-27 2021-03-12

这是我正在使用的查询 -

SELECT * 
  FROM A 
 RIGHT 
  JOIN B
    ON A.DATE BETWEEN B.START DATE AND B.END DATE

标签: mysql

解决方案


我假设示例2021-01-152021-01-29缺少日期范围Table B。如果是这样,此查询应该能够返回您的预期结果:

SELECT Units, Date, StartDate, EndDate
  FROM tableA a
  LEFT JOIN tableB b
    ON a.Date <= b.EndDate
    AND MONTH(a.Date) = MONTH(b.EndDate)
    ORDER BY b.StartDate

而不是RIGHT JOIN,我已经切换到LEFT JOIN。然后比较DatefromTable AEnd Datefrom Table Bwith <=(小于或等于)并使用月份匹配Date月份。使用提供的示例(包括假定的缺失日期范围),这将完全按照您的预期结果返回。End DateMONTH()

这是一个小提琴:https ://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=02c027506954489377a8e484693bff57


推荐阅读