两个日期之间的月份

时间:2018-10-24 13:32:21

标签: sql oracle date between

我想加入

我有下面两个表,当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

4 个答案:

答案 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