Изменяет ли среда Java значение параметра NLS_DATE_FORMAT? - PullRequest
2 голосов
/ 10 сентября 2011

У меня есть UNIX и Linux-сервер, используемый в качестве сервера базы данных и сервера приложений соответственно. База данных - Oracle 10g, а сервер приложений - Weblogic 9.3 MP3 с установленным jRockit 1.5. У меня есть пул соединений, созданный на сервере weblogic.

Я попытался прочитать NLS_DATE_FORMAT из таблиц NLS_DATABASE_PARAMETERS, NLS_SESSION_PARAMETERS и NLS_INSTANCE_PARAMETERS четырьмя различными способами.

  1. Использование sqlplus с отображением DD-MON-YYYY для всех, как и ожидалось.
  2. Соединение из пула в моем веб-приложении, таблица NLS_SESSION_PARAMETERS показывает его как DD-MON-RR, а в остальной части таблицы отображается DD-MON-YYYY.
  3. Автономные Java-программы, получающие соединение с БД напрямую, тот же результат, что и в (3)
  4. Запустил ту же программу с моего ПК, она показала тот же результат, что и в (1), т.е. .D-MON-YYYY для всех.

Я не установил NLS_LANG или NLS_DATE_FORMAT ни в одном месте (на сервере БД, на сервере приложений или на ПК) в моей среде. Init.ora имеет настройку ДД-МЕС-ГГГГ.

Так что отличает NLS_DATE_FORMAT при выполнении через Java-код на сервере.

Ответы [ 3 ]

4 голосов
/ 10 сентября 2011

Трудно сказать, что происходит, не видя ни одного вашего кода, но вам вообще не следует полагаться на формат даты базы данных. Вы должны извлекать значения даты / времени как объекты - затем вы можете отформатировать их по своему усмотрению. По сути, вы не храните строку - вы храните дату или метку времени. Дата, которую я, естественно, мог бы написать как «19/06/1976», может быть написана кем-то еще как «06-19-1976», но обе представляют одну и ту же дату.

Это все равно, что спрашивать, использует ли база данных шестнадцатеричное или десятичное число для хранения целых чисел: это тоже не так, насколько нам нужно: оно хранит сами целые числа. Обрабатывайте числа как числа, даты как даты, отметки времени как отметки времени и т. Д., И когда вы хотите что-то отобразить для пользователя, выберите наиболее подходящий для него формат.

1 голос
/ 10 сентября 2011

Насколько я знаю, драйвер JDBC будет настраивать параметры NLS в соответствии с тем, какое системное свойство Java установлено user.locale.

Так что, скорее всего, существует разница между настройкой локали сервера приложений и вашим локальным ПК.

0 голосов
/ 10 сентября 2011

"таблица NLS_SESSION_PARAMETERS показывает его как DD-MON-RR"

Этот формат устарел или, по крайней мере, должен быть устаревшим. Он был введен в конце девяностых годов в качестве решения проблем 2000 года. Его цель - добавить век к датам, которые вводятся только как YY. Он использует алгоритм управления окнами, чтобы решить, нужен ли YY век в 19 или 20. Стержень фиксирован - 49, так что броски календаря на распределениях становятся все более неудовлетворительными.

Тот факт, что вы получаете даты 0011 вместо предложений 2011 года, у вас есть текущие проблемы 2000 года. Пространство больше не является проблемой, на самом деле нет оправдания тому, что вы явно не указали полный формат YYYY.

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