#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 , вам, вероятно, потребуется использовать другую функцию преобразования / форматирования.