2013-02-18 6 views
1

После запроса дает ошибку:Oracle SQL запрос дает ошибку

SELECT to_char(last_day(add_months(to_char(to_date('01-02-2013','dd-mm-yyyy'), 
    'dd-MON-yyyy'),-1)) + 1,'dd-mm-yyyy') FROM dual; 

ORA-01858: a non-numeric character was found where a numeric was expected 

Я попробовал это на двух системах:

  1. с nls_date_format = 'DD-MON-RR' - этот запрос работает отлично ,

  2. С NLS_DATE_FORMAT = 'MM-DD-YYYY' - дает мне ошибку ORA-01858: a non-numeric character was found where a numeric was expected.

Любые подсказки относительно того, почему этот запрос терпит неудачу? Я не могу зависеть от формата DATE.

ответ

3

Почему вы делаете to_char при вызове add_months, вам необходимо пройти дату как

SELECT to_char(last_day(add_months(to_date('01-02-2013','dd-mm-yyyy'), 
    ,-1)) + 1,'dd-mm-yyyy') FROM dual; 
2

У вас есть неявное преобразование углеродно в актуальном состоянии, в add_months() вызова; аргумент, который вы передаете, является строкой, а не датой. to_char() у вас есть внутри, что является избыточным, и вызывает ошибку, когда ваш NLS_DATE_FORMAT не соответствует формату, который вы используете в том, что to_char():

SELECT to_char(last_day(add_months(to_date('01-02-2013','dd-mm-yyyy'),-1)) + 1, 
    'dd-mm-yyyy') FROM dual; 

Я не совсем уверен, что вы делаете, хотя. .. если вы хотите, в первый день месяца, дата, вы можете сделать это:

SELECT to_char(trunc(to_date('01-02-2013', 'dd-mm-yyyy'), 'MM'), 
    'dd-mm-yyyy') FROM dual; 

Это использует функцию TRUNC(date) эффективно округлить до начала месяца.

Смежные вопросы