2014-09-23 3 views
2

у меня есть этот выбор:Cast, как дата - буквальный не соответствует формату строки

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 - «Литерал не соответствует форматированной строке»

но когда я просто передаю строку «cast» («20140704» в качестве даты), так как Dt «работает нормально, почему?

Спасибо

ответ

3

Вопрос находится с NLS_DATE_FORMAT.

Позвольте мне объяснить с небольшой пример:

Мои NLS_DATE_FORMAT является DD-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
  • Alter его на уровне сеанса.
  • В качестве альтернативы, вы можете использовать TO_DATE и использовать надлежащие `FORMAT

Это OVERRIDE в locale-specific NLS settings.

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

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

Если вы хотите отобразить в desired format, а затем использовать TO_CHAR.

+0

Спасибо, что помогло много :) – Nightmaresux

+0

Добро пожаловать! –

2

Заменить строку

cast('20140704' as date) as Dt 

с

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

Это зависит от настроек NLS. 'TO_DATE' будет работать, потому что он переопределяет настройки locale-NLS. –