Почему я получаю ошибку Oracle, когда вычитаю один год из текущей даты? - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть этот запрос к базе данных Oracle 10g:

SELECT (CURRENT_DATE - INTERVAL '1' YEAR) FROM DUAL;

Он работал правильно, но сегодня я получил эту ошибку:

ORA-01839: date not valid for month specified
01839. 00000 -  "date not valid for month specified"
*Cause:    
*Action:

Я знаю, как я могу избежать такой ошибки, но мой вопрос, почему она выбрасывается?

Ответы [ 2 ]

8 голосов
/ 29 февраля 2012

Это ожидаемое поведение; см. шестую маркировку в арифметическом разделе дата / время документации.

Когда интервальные вычисления возвращают значение даты и времени, результат должен быть фактическое значение даты / времени или база данных возвращает ошибку. За Например, следующие два оператора возвращают ошибки:

SELECT TO_DATE('31-AUG-2004','DD-MON-YYYY') + TO_YMINTERVAL('0-1')
FROM DUAL;

SELECT TO_DATE('29-FEB-2004','DD-MON-YYYY') + TO_YMINTERVAL('1-0')
FROM DUAL;

Первый сбой, потому что добавление одного месяца к 31-дневному месяцу результат 31 сентября, который не является действительной датой. Второе терпит неудачу потому что добавление одного года к дате, которая существует только каждые четыре года, недействительный. Тем не менее, следующее утверждение успешно, потому что добавление четырех лет до 29 февраля действительна дата:

SELECT TO_DATE('29-FEB-2004', 'DD-MON-YYYY') + TO_YMINTERVAL('4-0')
FROM DUAL;

TO_DATE('
---------
29-FEB-08

Вы можете использовать add_months, который имеет противоположное поведение - что также может иногда вызывать путаницу. Вам нужно решить, какой из них наиболее подходит для вас.

2 голосов
/ 29 февраля 2012

Потому что в 2011 году не было 29 февраля

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...