2014-09-23 83 views
2

我有這樣的選擇:鑄成日 - 文字不匹配格式字符串

select P.DT03_DT as PROPOSAL_DATE, 
     p.dt02_dt as DATE_OF_JUDGEMENT, 
     P.DT05_DT as END_DATE, 
     cast('20140704' as date) as Dt 

     from imxdb.t_intervenants i  
     join imxdb.g_indivparam p 
     on i.refindividu = p.refindividu 

     where p.type = 'BANCRUPTCY'  
     AND (to_char(p.dt02_dt, 'yyyymmdd') ='20140704' or 
     to_char(P.DT05_DT, 'yyyymmdd') = '20140704') 

,這給我的錯誤:

ORA-01861:文字不匹配格式字符串 01861。 00000 - 「文字不匹配格式字符串」

但是當我剛commment行「劇組(‘20140704’的日期)爲DT」它的做工精細,爲什麼呢?

謝謝

回答

3

的問題是與NLS_DATE_FORMAT

讓我用一個小例子解釋:

NLS_DATE_FORMATDD-MON-RR

SQL> SELECT VALUE FROM V$NLS_PARAMETERS WHERE PARAMETER='NLS_DATE_FORMAT'; 

VALUE 
---------------------------------------------------------------- 
DD-MON-RR 

SQL> 

我可以驗證在SQL * Plus:

SQL> SELECT SYSDATE FROM DUAL; 

SYSDATE 
--------- 
23-SEP-14 

SQL> 

現在,如果我用CAST未知格式的日期文字,我將得到一個錯誤:

SQL> SELECT CAST('20140704' AS DATE) AS DT FROM DUAL; 
SELECT CAST('20140704' AS DATE) AS DT FROM DUAL 
      * 
ERROR at line 1: 
ORA-01861: literal does not match format string 


SQL> 

所以,我會給予必要的NLS_DATE_FORMAT,它應該是罰款:

SQL> SELECT CAST('23-sep-14' AS DATE) AS DT FROM DUAL; 

DT 
--------- 
23-SEP-14 

SQL> 

其他的替代品,

  • 更改NLS_DATE_FORMAT
  • 會話級改變它。
  • 或者,你可以使用TO_DATE並使用正確的格式`

它將OVERRIDElocale-specific NLS settings

SQL> select to_date('20140704', 'YYYYMMDD') from dual; 

TO_DATE(' 
--------- 
04-JUL-14 

如果你想在你的desired format顯示,然後使用TO_CHAR

+0

謝謝,那幫了很多:) – Nightmaresux 2014-09-23 10:57:57

+0

不客氣! – 2014-09-23 11:05:40

2

替換行

cast('20140704' as date) as Dt 

TO_DATE('20140704','YYYYMMDD') as Dt 
+0

這取決於NLS設置。 'TO_DATE'將起作用,因爲它會覆蓋區域設置-NLS設置。 – 2014-09-23 08:31:29