Месяц между двумя датами - PullRequest
       16

Месяц между двумя датами

0 голосов
/ 24 октября 2018

Я хочу присоединиться, когда

У меня есть две таблицы ниже, и я хочу присоединиться, когда столбец Месяц находится между первым днем ​​месяца 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 голосов
/ 24 октября 2018

Что лучше всего сработало для меня - это ниже.

LEFT JOIN A.ID = B.ID AND TO_DATE(B.MONTH,'MM/DD/YYYY') BETWEEN TRUNC(A.START_DT,'MM') AND A.END_DT
0 голосов
/ 24 октября 2018

Я хочу присоединиться, когда дата Месяца находится между первым днем ​​месяца start_dt и end_dt

Если это все, что вы хотите сделать, вы можете попробовать:

select <your fields>
from tableA
left join tableB on tableB.Month BETWEEN tableA.start_dt 
                                     AND tableA.end_dt

Это присоединяется к таблице B только в том случае, если поле месяца находится между start_dt и end_dt.

Редактирование на основе вопроса об изменении 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
0 голосов
/ 24 октября 2018

Ах, теперь я вижу лучше, для чего вы стреляете ... с таблицами и описанием проблемы, которую вы предоставили, это должно сделать то, что вам нужно.Есть множество способов манипулировать датами;много возможных ответов на это.Но цель состоит в том, чтобы вы пытались «отодвинуть» 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
0 голосов
/ 24 октября 2018

хотите ли вы объединить влево между двумя таблицами, как показано ниже

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 для ввода ключа соединения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...