mysql - 基于日期范围连接的填充数据库
问题描述
我有一个日期设置为每个月的第一天的数据集。例如 -
单位 | 日期 |
---|---|
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
解决方案
我假设示例2021-01-15
中2021-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
。然后比较Date
fromTable A
与End Date
from Table B
with <=
(小于或等于)并使用月份匹配Date
月份。使用提供的示例(包括假定的缺失日期范围),这将完全按照您的预期结果返回。End Date
MONTH()
这是一个小提琴:https ://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=02c027506954489377a8e484693bff57
推荐阅读
- google-apps-script - appscript 中是否有 i.height 参数?
- laravel - 使用 Laravel 干预的圆形图像
- javascript - React中如何在页面上同时使用HashRouter和锚点导航?
- flutter - 如何在 Flutter 中创建加载屏幕?
- r - 置信区间:使用 mob() 树(partykit 包)和logistic() 模型
- r - 如何根据特定的列顺序对数据集进行排序
- javascript - 使用 i18n 的时刻格式
- apache-kafka - KStream copartition join 使用不同模式名称的 avro 键
- c# - 捕获雨水算法复杂度
- linux - 获取安装在数组变量 BASH 中的 yum list