[英]Not A valid Month - SQL ORA-01843 - In unix
我正在使用
TO_CHAR(TO_DATE(tdj_tran_dt,'DD-MON-RRRR'),'DD-MON-RRRR')
在我的觀點之一中。
基礎數據的格式為DD-MON-YY
,我必須在屏幕上以DD-MON-YYYY
的形式顯示它。
最初,我是to_char(tdj_Tran_dt,'DD-MON-YYYY')
使用to_char(tdj_Tran_dt,'DD-MON-YYYY')
,但沒有解決問題。 例如,20-OCT-17將變為20-OCT-0017。 我的系統已遷移了數據,因此在插入表時更改數據的形式無濟於事。 因此,為此,我使用了TO_CHAR(TO_DATE(tdj_tran_dt,'DD-MON-RRRR'),'DD-MON-RRRR')
,它似乎在除Unix之外的任何地方都有效。 我有一個proc文件(通過linux運行),該文件調用此視圖並以xls格式寫入數據。 但是在打開游標的過程中,它給出了Oracle錯誤ORA-01843。 將其更改回to_char(tdj_Tran_dt,'DD-MON-YYYY')
似乎可行,但又帶回了原來的問題。
我只想知道數據庫中是否有一些設置可以更改以解決此問題。 我在兩個不同的環境中運行相同的東西,並且無效的月份錯誤似乎僅在一個環境中發生。 我已經檢查了nls_parameters,這似乎在兩種環境中都是相同的。
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET AL32UTF8
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
我已經檢查了很多地方,但沒有解決辦法。 如果有人知道如何解決此問題,請提供幫助。
我要tdj_tran_dt
猜測tdj_tran_dt
實際上是DATE
列,因為您提到您使用的是to_char(tdj_tran_dt,'DD-MON-YYYY')
,如果它是字符串,那將失敗。 (這也可以解釋為什么to_date(tdj_tran_dt,'DD-MON-RRRR')
在另一個環境中失敗,如果那里的nls_date_format
與'DD-MON-RRRR'
不兼容。)因此,問題在於某些日期是錯誤地輸入為0017年等,即公元1世紀。
如果是這種情況,那么您可能希望通過丟棄本世紀並替代一個更接近的日期來清理那些過時的日期,同時保留更接近今天的日期。
with demo (tdj_tran_dt) as
( select date '0017-01-30' from dual union all
select date '1917-01-30' from dual union all
select date '1960-01-30' from dual union all
select date '2017-01-30' from dual )
select tdj_tran_dt
, to_date(to_char(tdj_tran_dt,'DD-MON-YY'),'DD-MON-RR') as fixed_tran_dt
from demo
order by tdj_tran_dt;
TDJ_TRAN_DT FIXED_TRAN_DT
------------ -------------
30-JAN-0017 30-JAN-2017
30-JAN-1917 30-JAN-2017
30-JAN-1960 30-JAN-1960
30-JAN-2017 30-JAN-2017
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.