Вопрос состоит в том, чтобы выбрать поле date_ из таблицы b, где поле date_ в таблице b на месяц опережает поле date_ в таблице a.
Необходимо принять во внимание дополнительное требование, которое в настоящее время не указано в вопросе.,Заинтересованы ли мы в полных месяцах (дни месяца не учитываются) или мы хотим включить дни, которые могут дисквалифицировать даты, которые на один месяц вперед, но только на пару дней (пример: a = 2011-04-30 иb = 2011-05-01, b на 1 месяц вперед, но только на 1 день).
В первом случае мы должны усечь обе даты до их значений года и месяца:
SELECT TRUNC( TO_DATE('2011-04-22','yyyy-mm-dd'), 'mm') as trunc_date
FROM dual;
дает:
trunc_date
----------
2011-04-01
Во втором случае нам не нужно изменять даты.
Для решения исходной задачи можно использовать как минимум два подхода:
Первый вращается вокруг добавления одного месяца к полю date_ в таблице a и поиска строки в таблице b с соответствующей датой.
SELECT b.date_field
FROM tab_a as a
,tab_b as b
WHERE ADD_MONTHS( TRUNC( a.date_field, 'mm' ), 1) = TRUNC( b.date_field, 'mm' )
;
Обратите внимание на усеченные даты.Для этого потребуется идеальное ежедневное соответствие между датами.
Второй подход основан на расчете разницы в месяцах между двумя датами и выборе расчета, дающего разницу в 1 месяц.
SELECT b.date_field
FROM tab_a as a
,tab_b as b
WHERE months_between( TRUNC( b.date_field, 'mm') , TRUNC(a.date_field, 'mm') ) = 1
Здесь важен порядок полей в months_between.В приведенном примере:
- для b.date_field на один месяц впереди для a.date_field значение равно 1
- для b.date_field на один месяц до a.date_field значение равно -1 (отрицательное)
Изменение порядка также перевернет результаты.
Надеюсь, что это ответ на ваш вопрос.