根据日期范围内是否(完全)包含年份进行匹配

Matching based on whether year is included (at all) in date range

我正在尝试根据日期范围加入两个 table。

Table 格式为:

ID   CAT    DATE_START    DATE_END
1    10     2018-01-01    2020-12-31
2    15     2018-06-01    2018-07-01

Table B格式为:

ID    YEAR       VALUE
1     2017       100
1     2018       110
1     2019       90
1     2020       30
2     2018       200

如果对于给定的 ID,B.YEAR 中的任何一天都包含在 A.DATE_START 到 A.DATE_END 的日期范围内,则应合并结果 table,应该是这样的:

ID    YEAR    CAT    VALUE
1     2018    10     110
1     2019    10     90
1     2020    10     30
2     2018    15     200

我尝试使用 extract(year from DATE_START) extract(year from DATE_START) 合并,但我无法将 2019 年中年包含在间隔中,这意味着 ID = 1 缺少其 2019 年的值。

我也尝试过使用to_date(YEAR), 'YYYY')合并,但是YEAR ='2018'的生成日期是'1.9.2018',不在ID = 2的时间间隔内。非常感谢您的帮助.

首先:我使用 Microsoft SQL 服务器,如果这在 Oracle 中不起作用,我们深表歉意。

SELECT * FROM TableA 
INNER JOIN TableB ON TableA.Id = TableB.Id AND TableB.Year BETWEEN YEAR(TableA.Date_Start) AND YEAR(TableA.Date_End)

像这样加入表格:

select a.ID, b.YEAR, a.CAT, b.VALUE 
from TableA a inner join TableB b
on b.ID = a.ID 
and b.year between extract(year from a.DATE_START) and extract(year from a.DATE_END)

参见demo
结果:

> ID | YEAR | CAT | VALUE
> -: | ---: | --: | ----:
>  1 | 2018 |  10 |   110
>  1 | 2019 |  10 |    90
>  1 | 2020 |  10 |    30
>  2 | 2018 |  15 |   200