Po intensywnych badaniach jasne jest, dlaczego niektóre z naszych wyborów nie działają dzisiaj. Błąd jest spowodowany słowem kluczowym interval
i jego znanym problemem. (Lub jest to, w jaki sposób ANSI/ISO spec mówi to powinno działać, dolna strona 205/górnej stronie 206)
Oto qoute z oracle community blog:
Pytanie:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '2' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '3' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '4' year as dt from dual;
29-FEB-16 00:00:00
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' day as dt from dual;
01-MAR-12 00:00:00
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' month as dt from dual;
29-MAR-12 00:00:00
odpowiedzi:
Tak właśnie działają INTERWAŁY. Lata przestępne są najmniejsze z problemów związanych z ; dodanie 1 miesiąca do 31 marca powoduje ten sam błąd. Jeśli chcesz, aby wynik był prawidłowy DATE, użyj ADD_MONTHS. (Nie ma oddzielny funkcja dodawania lat; używać ADD_MONTH (sysdate, 12 * N), aby uzyskać informacje o dacie, która jest n lat od teraz.)
Dlaczego to się dzieje w naszym przypadku:
W naszym przypadku użyliśmy wirtualnej prywatnej bazy danych dla niektórych naszych stołów ze względów bezpieczeństwa. I tam zastosowaliśmy słowo kluczowe interval
w większości wyborów.
Co zrobić zamiast:
Zastosowanie ADD_MONTHS
zamiast.
select add_months(to_date('2012-feb-29','yyyy-mon-dd'), 12) as dt from dual;
Jaki jest typ danych kolumny 'table_date'? –
@ WernfriedDomscheit jego 'date' – Patrick
Czy' select table_date from ... 'również pobiera ten błąd - może jest to inna kolumna, która kończy się niepowodzeniem przy niejawnej konwersji? Czy jest to tabela lub widok (który coś wylicza); czy ma wirtualną kolumnę? Co to jest NLS_DATE_FORMAT w sesji, która otrzymuje błąd? Czy widzisz to w konkretnym kliencie i czy możesz powielić w SQL \ * Plus? –