Sql 根据日期范围中是否包含(全部)年份进行匹配
我正在尝试根据日期范围连接两个表 表A格式为: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
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,我将进行编辑。谢谢你的快速回答!