По существу у меня есть запрос, который ответственен за выборку всех записей (с определенными фильтрами) в течение прошлого месяца. Я использую ключевое слово интервала Oracle, и все работало отлично до сих пор (31-го декабря 2009). Код, который я использую,
select (sysdate - interval '1' month) from dual
и ошибка я получаю его
ORA-01839: date not valid for month specified
Как я могу использовать ключевое слово интервала, чтобы быть совместимым с какой-либо датой? Или если у кого-либо есть лучший способ приблизиться к проблеме, я внимательно слушаю.
Спасибо.
Будучи педантичным...
Требования не совсем однозначно сформулированы. Что означает "в течение последнего месяца"? Большинство людей восприняли бы это как "в пределах текущего календарного месяца", и в этом случае я бы использовал:
TRUNC(SYSDATE,'MM')
Иначе, возможно, им нужен произвольный период в 1 месяц до текущей даты - но как это определить? Как Вы обнаружили, INTERVAL '1' MONTH
просто вычитает один из месячной части даты - например, 15-JAN-2009 - INTERVAL '1' MONTH
возвращает 15-DEC-1999. Для некоторых дат это приводит к недействительной дате, так как не все месяцы имеют одинаковое количество дней.
ADD_MONTHS
решает эту проблему путем возврата последнего дня в месяце, например ADD_MONTHS(31-DEC-2009,-1)
возвращает 30-NOV-2009.
Другая возможность заключается в том, что предприятие на самом деле хочет использовать средний месячный период - например, 365/12, что составляет приблизительно 30,4. Возможно, они захотят, чтобы вы использовали SYSDATE-30
, хотя, конечно, двенадцать итераций из них будут охватывать только 360 дней в году.