經過深入細緻的研究,它清楚爲什麼我們的一些選擇的今天不上班。該錯誤是由關鍵字interval
及其已知問題引起的。 (或者它的ANSI/ISO spec怎麼說,它應該工作,第206頁的第205頁/頂的底部)
下面是從oracle community blog一個qoute:
問題:
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
回答:
這就是INTERVALs的工作原理。閏年是 問題中最少的; 3月31日增加1個月導致同樣的錯誤。如果您要 要確保結果是有效日期,請使用 ADD_MONTHS。 (有添加多年沒有獨立的功能;使用 ADD_MONTH(SYSDATE,12 * N)來獲得日期是N年從現在開始。)
爲什麼它會發生在我們的例子:
在我們的例子中,我們使用虛擬專用數據庫,我們的一些因爲安全原因表。並且我們在大多數選擇中應用了interval
關鍵字。
該怎麼做:
使用ADD_MONTHS
代替。
select add_months(to_date('2012-feb-29','yyyy-mon-dd'), 12) as dt from dual;
列'table_date'的數據類型是什麼? –
@WernfriedDomscheit它的一個'date' – Patrick
'是否從選擇table_date ...'也得到這個錯誤 - 也許是被隱式轉換失敗不同的列?它是一張桌子還是一張視圖(用來計算某種東西);還是它有一個虛擬列?會話中出現錯誤的NLS_DATE_FORMAT是什麼?你是否在特定的客戶端看到了這一點,並且可以在SQL \ * Plus中重現? –