проблема с форматом даты оракула

Мы используем базу данных Oracle 10.2.0.4.0, построитель форм oracle и построитель отчетов для создания форм и отчетов.

Теперь проблема в нашей производственной базе данных. nls_date_format имеет формат dd-mon-rr. Когда разработчик создает форму в костюме разработчика, он задает формат дд-мм-рр на уровне формы, а когда данные хранятся в таблице, этот формат даты - dd-mm-rr.

Теперь, когда разработчик запускает форму или отчет в построителе форм, он выдает формат dd-mm-rr. Но когда та же форма или отчет запускается со стороны сервера приложений, он дает ненужные символы в месяце. Дата и год печатаются так же, как формат даты, только месяц отображается в мусоре. персонажи.

Надеюсь, вы все хорошо ведете.


person Jayesh    schedule 26.10.2015    source источник


Ответы (1)


Есть две проблемы.

когда данные хранятся в таблице, формат даты - дд-мм-рр.

Это совершенно неправильно. 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
comment
мы уже использовали to_char в формах оракула, разрабатываемых для преобразования DD-MM-RR, но все еще проблемы ... на стороне сервера приложений оракула. - person Jayesh; 26.10.2015
comment
@jayeshkamaliya Могу поспорить, что вы зависите от NLS_DATE_LANGUAGE клиента. См. обновленный пример. - person Lalit Kumar B; 26.10.2015
comment
сэр, в нашей базе данных nls_language_date является американским, а в формах приложений оракула в этом реестре nls_lang является GUJARATI_INDIA.UTF8, это может быть причиной этой проблемы? - person Jayesh; 26.10.2015
comment
@jayeshkamaliya Да, это будет проблемой. Ваша клиентская ОС NLS_LANG не поддерживает символы, которые вы хотите отобразить. См. Почему нежелательные значения/специальные символы/вопросительные знаки, отображаемые в моем клиенте? - person Lalit Kumar B; 26.10.2015
comment
спасибо, сэр. но я проверяю, что в производственной базе данных обе имеют одинаковое значение. но основная проблема заключается в том, что когда мы запускаем форму со стороны сервера приложений Oracle, она дает ненужный характер, а на стороне сервера приложений оракула я проверяю, что nls_lang - это GUJARATI_INDIA.UTF8, поэтому это может быть причиной нежелательного характера. - person Jayesh; 26.10.2015
comment
На вашем сервере приложений NLS_LANG должен поддерживать GUJARATI_INDIA.UTF8. Сделайте одну вещь: на сервере приложений поместите вывод в буфер в виде файла HTML и откройте в браузере. Вы сможете увидеть, как большинство браузеров имеют возможность отображать несколько наборов символов. Таким образом, вы можете убедиться, что база данных отправляет правильное значение, но сервер приложений не может его отобразить. - person Lalit Kumar B; 26.10.2015
comment
сэр, я не могу понять, что вы говорите. любая справочная ссылка для этого, чтобы я мог прочитать, а затем применить на своем рабочем сервере. спасибо, сэр, за поддержку. - person Jayesh; 26.10.2015
comment
Просто откройте SQLPlus на своем сервере приложений, найдите в Google, как буферизовать результат SQL-запроса в SQLPlus, буферизовать вывод SELECT TO_CHAR(SYSDATE, 'DD-MON-RR') FROM DUAL; as output.html`. - person Lalit Kumar B; 26.10.2015