Sql 根据日期范围中是否包含(全部)年份进行匹配

Sql 根据日期范围中是否包含(全部)年份进行匹配,sql,oracle,date,between,Sql,Oracle,Date,Between,我正在尝试根据日期范围连接两个表 表A格式为: ID CAT DATE_START DATE_END 1 10 2018-01-01 2020-12-31 2 15 2018-06-01 2018-07-01 ID YEAR VALUE 1 2017 100 1 2018 110 1 2019 90 1 2020 30 2 2018

我正在尝试根据日期范围连接两个表

表A格式为:

ID   CAT    DATE_START    DATE_END
1    10     2018-01-01    2020-12-31
2    15     2018-06-01    2018-07-01
ID    YEAR       VALUE
1     2017       100
1     2018       110
1     2019       90
1     2020       30
2     2018       200
表B格式为:

ID   CAT    DATE_START    DATE_END
1    10     2018-01-01    2020-12-31
2    15     2018-06-01    2018-07-01
ID    YEAR       VALUE
1     2017       100
1     2018       110
1     2019       90
1     2020       30
2     2018       200
如果对于给定ID,B.YEAR中的任何一天包含在从a.date_开始到a.date_结束的日期范围内,则应合并生成的表,并且应如下所示:

ID    YEAR    CAT    VALUE
1     2018    10     110
1     2019    10     90
1     2020    10     30
2     2018    15     200
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)
我尝试使用
extract(从开始日期算起的年份)
extract(从开始日期算起的年份)
进行合并,但我无法将中间年份2019包含在时间间隔中,这意味着ID=1缺少其2019值


我还尝试使用
合并到_date(YEAR),'YYYY')
,但YEAR='2018'的生成日期是'1.9.2018',这不属于ID=2的时间间隔。非常感谢您的帮助。

首先:我使用的是Microsoft SQL Server,如果在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)

按如下方式连接表:

ID    YEAR    CAT    VALUE
1     2018    10     110
1     2019    10     90
1     2020    10     30
2     2018    15     200
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)
请参阅。
结果:


你为什么用身份证加入?我相信这会给出不正确的结果。如果你检查预期的结果,这并不含糊。加入也必须基于ID。查看他的数据后,我同意你的看法。我基于“如果B.YEAR中的任何一天包含在从A.date_开始到A.date_结束的日期范围内,则结果表应合并”的初始假设不使用ID,该假设未提及加入ID的要求。感谢您和big plus的演示!这种方法应该有效,但您需要调整年份以使用提取,因为年份严格来说是Microsoft的函数。@AbrahamLincoln<大多数数据库都支持code>YEAR(),Oracle是一个例外。也就是说,
EXTRACT()
是标准的。我修改了我的解决方案以包含ID。虽然作者没有声明他也加入了ID,但预期结果表明他有这个期望。我将接受forpas的解决方案作为公认的答案,因为它使用Oracle SQL语法而不是我使用的Microsoft语法。对于不清楚,我深表歉意,加入还应包括ID,我将进行编辑。谢谢你的快速回答!