Oracle to_date () неверный вывод - PullRequest
2 голосов
/ 04 ноября 2011

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

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

Интересно, что они переносятся (-), а нес косой чертой (/).

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

Ответы [ 3 ]

6 голосов
/ 04 ноября 2011

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

1 голос
/ 04 ноября 2011

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

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

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

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

0 голосов
/ 04 ноября 2011

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

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

...