Вы пишете "Я хочу вычесть ровно 6 месяцев от указанной даты". Но что такое "ровно 6 месяцев"? Это не тривиально. Например, возьмем 30 августа 2009 года. Какая дата ровно на 6 месяцев раньше? Или 28 февраля 2009 года ...
Таким образом, вы должны определить, что вы имеете в виду, а затем решить, какой метод вы хотите использовать:
- add_months (..., - 6)
- -интервал '6' месяц
- собственный код
Пример:
SQL> select add_months(date '2009-08-30', -6)
2 , add_months(date '2009-02-28', -6)
3 from dual
4 /
ADD_MONTHS(DATE'200 ADD_MONTHS(DATE'200
------------------- -------------------
28-02-2009 00:00:00 31-08-2008 00:00:00
1 row selected.
SQL> select date '2009-02-28' - interval '6' month
2 from dual
3 /
DATE'2009-02-28'-IN
-------------------
28-08-2008 00:00:00
1 row selected.
SQL> select date '2009-08-30' - interval '6' month
2 from dual
3 /
select date '2009-08-30' - interval '6' month
*
ERROR at line 1:
ORA-01839: date not valid for month specified
Как видите, между add_months и интервальной нотацией есть четкая разница.
С уважением,
Роб.