Интервал одного месяца, назад не работающего над 31-м?

По существу у меня есть запрос, который ответственен за выборку всех записей (с определенными фильтрами) в течение прошлого месяца. Я использую ключевое слово интервала Oracle, и все работало отлично до сих пор (31-го декабря 2009). Код, который я использую,

select (sysdate - interval '1' month) from dual

и ошибка я получаю его

ORA-01839: date not valid for month specified

Как я могу использовать ключевое слово интервала, чтобы быть совместимым с какой-либо датой? Или если у кого-либо есть лучший способ приблизиться к проблеме, я внимательно слушаю.

Спасибо.

5
задан Mike 31 December 2009 в 13:24
поделиться

2 ответа

try

select add_months(sysdate,-1) from dual
10
ответ дан 13 December 2019 в 05:36
поделиться

Будучи педантичным...

Требования не совсем однозначно сформулированы. Что означает "в течение последнего месяца"? Большинство людей восприняли бы это как "в пределах текущего календарного месяца", и в этом случае я бы использовал:

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 дней в году.

.
2
ответ дан 13 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: