Oracle to_date() неверный вывод

Должен быть очень простой ответ, но я нигде не могу его найти.

У меня есть следующее, что является частью моего оператора select:

       case when q.renewal_date is not null then
            to_date(q._renewal_date, 'DD/MM/YYYY')
       else
            to_date(w.END_DATE, 'DD/MM/YYYY')
       end END_DATE,

согласно всем документам, я могу найти, что MM должен указывать месяц в цифрах, однако я получаю такие результаты, как:

30-SEP-12
26-JUN-11
30-SEP-12

Также интересно, что они написаны через дефис (-), а не с косой чертой (/).

Так в чем причина этого и как мне добиться того, чего я хочу?


person m.edmondson    schedule 04.11.2011    source источник


Ответы (3)


Предполагая, что w.end_Date и q._renewal_date являются реальными датами, вы хотите to_char их, а не to_date. В настоящее время я бы сказал, что вы видите даты в формате, указанном вашими настройками NLS. (Если это не даты, вы конвертируете их в даты, но по-прежнему позволяете настройкам NLS выбирать формат, в котором вы их просматриваете)

person Andrew    schedule 04.11.2011

Поскольку вы устанавливаете значение TO_DATE, оно сохраняется внутри Oracle как дата. Он отображается обратно вам с использованием вашего значения настроек NLS_DATE, которое, как я полагаю, установлено на DD-MON-YY по умолчанию.

Вы можете проверить с

SELECT *
  FROM v$parameter
 WHERE name = 'nls_date_format';

Вам нужно либо изменить NLS_DATE_FORMAT настройку (либо для вашего сеанса, либо для БД), либо TO_CHAR вывод в формате, который вы хотите видеть.

person Ollie    schedule 04.11.2011

to_date преобразует строку в дату. Код, который у вас есть, берет строку (q._renewal_date) в формате «ДД/ММ/ГГГГ» и преобразует ее в дату. То, что вы видите, является рендерингом поля даты по умолчанию.

В зависимости от типа q._renewal_date вам, вероятно, потребуется использовать другую функцию преобразования/форматирования.

person Eric Scott    schedule 04.11.2011