Выпуск формата даты оракула
Мы используем Oracle 10.2.0.4.0
база данных, оракул форм и отчетов для создания форм и отчетов.
Теперь проблема в нашей производственной базе данных nls_date_format в формате dd-mon-rr. Когда разработчик создает форму в костюме разработчика, он дает формат dd-mm-rr на уровне формы, а когда данные хранятся в таблице, этот формат даты dd-mm-rr
,
Теперь, когда разработчик запускает форму или отчет в конструкторе форм, он выдает dd-mm-rr format.but, когда та же самая форма или отчет запускается со стороны сервера приложений, он выдает ненужные символы в month.date, а год печатается так же, как формат даты. персонажи.
Надеюсь, что вы все хорошо ведете.
1 ответ
Есть два вопроса.
когда данные хранятся в таблице, этот формат даты является дд-мм-р-р.
Это совершенно неправильно. Oracle не хранит дату в том формате, который вы видите, для отображения. Oracle хранит DATE во внутреннем проприетарном формате в 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
Не зависит от locale_specific NLS_DATE_FORMAT. Всегда используйте:
- TO_CHAR для отображения даты в желаемом формате
- TO_DATE для явного преобразования строки в дату.
Помните, что TO_DATE зависит от NLS.
Если у вас есть только элемент даты, и если вы не заботитесь об элементе времени, то лучше использовать литерал даты ANSI, который следует фиксированному формату 'YYYY-MM-DD'
,
отображение только месяца в барахлах
Это снова, потому что вы зависите от NLS_DATE_LANGUAGE. Как я уже сказал, вам следует избегать зависимости от настроек клиента для конкретной локали. Явно упомянуть NLS_DATE_LANGUAGE
или используйте литерал ANSI Date, если вас не интересует элемент времени.
Например,
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
Итак, что случилось выше? для человека, использующего ФРАНЦУЗСКИЙ nls_date_language
МЕСЯЦ показывает значение мусора. Давайте сделаем его 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 может быть неправильно установлено в переменной среды ОС. См. Почему на моем клиенте отображаются нежелательные значения / специальные символы / вопросительные знаки?