Добавление одного месяца к сохраненной дате (оракул) - PullRequest
0 голосов
/ 17 апреля 2011

У меня есть таблица A, которая содержит атрибут типа Date.Я хочу написать запрос, чтобы выбрать дату в другой таблице B со значением через месяц после значения в A. Кто-нибудь знает, как это сделать в Oracle?

Ответы [ 3 ]

8 голосов
/ 17 апреля 2011

хм ... Это был первый хит на Google:

http://psoug.org/reference/date_func.html

Кажется, вы ищете функцию "add_months".

6 голосов
/ 17 апреля 2011

Вам необходимо использовать функцию ADD_MONTHS в Oracle.

http://www.techonthenet.com/oracle/functions/add_months.php

Дополнительная информация: Если вы хотите использовать эту функцию с сегодняшней датой, выможно использовать ADD_MONTHS(SYSDATE, 1), чтобы получить месяц спустя.

2 голосов
/ 22 апреля 2011

Вопрос состоит в том, чтобы выбрать поле 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 (отрицательное)

Изменение порядка также перевернет результаты.

Надеюсь, что это ответ на ваш вопрос.

...