我想加入
我有下面两个表,当Month列在start_dt月的第一天和end_dt之间时,我想加入
tableA
id start_dt end_dt
1 1/10/2018 12/31/9999
1 02/01/2018 12/31/9999
tableB
id Month
1 1/1/2018
使用以下语法,但两次尝试均收到错误消息
LEFT JOIN id = id AND A.MONTH = TRUNC(AHR2.START_DT,'MM') AND AHR2.END_DT
--ERROR NOT A VALID MONTH
--LEFT JOIN id = id AND TO_CHAR(TO_DATE(A.MONTH, 'DD/MM/YYYY'),'YYYYMM') BETWEEN TO_CHAR(AHR2.START_DT,'YYYYMM') AND AHR2.END_DT
--ERROR LITERAL DOES NOT MATCH FORMAT STRING
预期结果:
id Month Start_dt end_dt
1 01/01/2018 01/10/2018 12/31/9999
答案 0 :(得分:2)
我想在月份日期介于start_dt月的第一天和end_dt之间加入
如果这只是您想要做的,则可以尝试:
select <your fields>
from tableA
left join tableB on tableB.Month BETWEEN tableA.start_dt
AND tableA.end_dt
仅当月份字段介于start_dt和end_dt之间时,此表才连接到tableB。
根据OP修改问题进行编辑:
他说:
在start_dt月的第一天之间
如果仅在start_dt月份的第一天才需要匹配start_dt,则此查询应对此有效。
select <your fields>
from tableA
left join tableB on tableB.Month BETWEEN DATEADD(month, DATEDIFF(month, 0, tableA.start_dt), 0)
AND tableA.end_dt
答案 1 :(得分:0)
您是否希望像下面的两个表之间保持联接
select a.* from tabla a left join tableb b on a.id=b.id
where a.Month >=b.start_dt and a.month<=b.end_dt
LEFT JOIN AND
是无效的sql语法,您必须在左连接后放置表名,然后需要on
来放置连接键
答案 2 :(得分:0)
啊,现在,通过提供的表格和问题描述,我可以更好地了解您的目标...这应该可以满足您的需求。有很多方法可以操纵日期。许多可能的答案。但目标是您应该尝试将start_dt“推”回其月份的第一天,然后进行比较。所以
SELECT * from tableA AHR2
LEFT JOIN tableB B
ON A.ID = B.ID
AND B.Month
BETWEEN (AHR2.start_dt - (1+ DAYS(AHR2.start_dt)))
AND
AHR2.end_dt
或
BETWEEN ADD_MONTHS((LAST_DAY(AHR2.start_dt)+1),-1)
AND
AHR2.end_dt
答案 3 :(得分:0)
最适合我的是以下内容。
LEFT JOIN A.ID = B.ID AND TO_DATE(B.MONTH,'MM/DD/YYYY') BETWEEN TRUNC(A.START_DT,'MM') AND A.END_DT