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

#sql #oracle #select #toad

#sql #Oracle #выберите #жаба

Вопрос:

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

У меня есть следующее, которое является разделом моего 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
  

Также интересно, что они пишутся через дефис (- ), а не через косую черту (/).

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

Ответ №1:

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

Ответ №2:

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

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

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

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

Ответ №3:

to_date преобразует строку в дату. Ваш код принимает строку (q._renewal_date) в формате ‘ДД / ММ / ГГГГ’ и преобразует ее в дату. То, что вы видите, — это отображение поля даты по умолчанию.

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