Есть две проблемы.
когда данные хранятся в таблице, формат даты - дд-мм-рр.
Это совершенно неправильно. Oracle не хранит дату в формате, который вы видите, то, что вы видите, предназначено для отображения. Oracle хранит ДАТУ во внутреннем собственном формате в 7 bytes
, где каждый байт представляет разные элементы ДАТЫ.
Byte Description
---- -------------------------------------------------
1 Century value but before storing it add 100 to it
2 Year and 100 is added to it before storing
3 Month
4 Day of the month
5 Hours but add 1 before storing it
6 Minutes but add 1 before storing it
7 Seconds but add 1 before storing it
Не зависьте от специфического для локали NLS_DATE_FORMAT. Всегда используйте:
- TO_CHAR для отображения даты в желаемом формате.
- TO_DATE, чтобы явно преобразовать строку в дату.
Помните, что TO_DATE зависит от NLS.
Если у вас есть только элемент даты и вам не нужен элемент времени, лучше использовать литерал даты ANSI, который соответствует фиксированному формату 'YYYY-MM-DD'
.
отображение только месяца ненужными символами
Опять же, потому что вы зависите от NLS_DATE_LANGUAGE. Как я уже сказал, вам следует избегать зависимости от зависящих от региона настроек клиента. Явно укажите NLS_DATE_LANGUAGE
или используйте литерал даты ANSI, если вас не волнует элемент времени.
Например,
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR') dt FROM DUAL;
DT
---------
26-OCT-15
SQL> alter session set nls_date_language='french';
Session altered.
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR') dt FROM DUAL;
DT
-----------
26-OCT. -15
Итак, что же произошло выше? для человека, использующего FRENCH nls_date_language
, MONTH показывает нежелательное значение. Давайте сделаем его независимым от NLS, явно упомянув nls_date_language
.
SQL> SELECT TO_CHAR(SYSDATE, 'DD-MON-RR', 'nls_date_language=english') dt FROM DUAL;
DT
---------
26-OCT-15
Кроме того, значение NLS_LANG может быть неправильно установлено в переменной среды операционной системы. См. Почему нежелательные значения /специальные символы/вопросительные знаки, отображаемые в моем клиенте?
person
Lalit Kumar B
schedule
26.10.2015