2013-06-26 8 views
0
11g документация

Oracle говорит, что формат даты по умолчанию DD-MON-YYYY, что означает, что если вставить дату столбца даты с помощью:Oracle формат даты

insert into table t values(1, '02-JAN-2013') 

, а затем выберите его

select * from t 

он должен отображаться как 02-JAN-2013, тогда как в действительности он отображает дату как 01/02/2013.

Почему его несоответствие или я что-то упускаю.

Реф. http://infolab.stanford.edu/~ullman/fcdb/oracle/or-time.html

FYI. Я использую PL/SQL Developer для этого эксперимента.

ответ

1

Это зависит от NSL_DATE_FORMAT, которая зависит от NLS_TERRITORY

Дайте Посмотрите: http://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams122.htm

+0

Если это так, то почему я должен использовать конкретный формат при сравнении дат: например. выберите si.effective_date из search_instance si, где si.effective_date> '26 -JUN-2013 ', по si.effective_date. Если вместо '26 -JUN-2013 'я использую '06/26/2013', он скажет «Недействительный месяц». – user204069

+0

Я стараюсь использовать всегда формат даты ansi: «YYMMDDHHMISS» с этим, мне не нужно проверять, какой формат использует БД. Тогда я могу использовать что-то вроде 'si.effective_date> '20130626000000'' – Aguardientico

2

Существует действительно не формат даты по умолчанию для продукта, reference guide утверждает, что по умолчанию для NLS_DATE_FORMAT на системном уровне основан на NLS_TERRITORY. Хотя this говорит, что «стандарт» - это «DD-MON-RR», и я думаю, что это то, что вы получаете, если не укажете значение на уровне базы данных, по крайней мере, на платформах, над которыми я работал.

При создании новой базы данных параметры инициализации могут включать в себя конкретный NLS_DATE_FORMAT и которые также могут быть изменены позже.

Но системный уровень NLS_DATE_FORMAT может быть переопределен клиентом, сеансом или вызовом TO_CHAR. Вы можете посмотреть в v$nls_parameters, чтобы увидеть системное значение, и nls_session_parameters, чтобы увидеть текущее значение сеанса. Вы можете изменить это с помощью alter session, если хотите.

Я уверен, вы обнаружите, что разработчик PL/SQL устанавливает сеанс NLS_DATE_FORMAT в MM/DD/YYYY где-то в своих предпочтениях.

Как правило, лучше не полагаться на это значение вообще и всегда использовать явную форму маску для отображения, например. TO_CHAR(<column>, 'YYYY-MM-DD HH24:MI:SS').

В руководстве по глобализации больше NLS_DATE_FORMAThere и here; и немного о дате отображения here; и обзор элементов модели формата даты here

+0

Если это так, то почему я должен использовать конкретный формат при сравнении дат: например. выберите si.effective_date из search_instance si, где si.effective_date> '26 -JUN-2013 ', по si.effective_date. Если вместо '26 -JUN-2013 'я использую '06/26/2013', он скажет «Недействительный месяц». – user204069

+1

Чтобы ответить на ваш комментарий, прочитайте мой ответ [здесь] (http://stackoverflow.com/questions/10178292/comparing-dates-in-oracle-sql/10178346#10178346) или [здесь] (http: // stackoverflow.com/questions/15970277/compare-with-date-in-oracle-sql/15970516 # 15970516) (Я уверен, что у Alex столько же) @ user204069 ... Ты *** не *** сравнивая даты там , вы сравниваете строки. _Always_ явно преобразует строки в дату сопоставления даты. – Ben

+1

@ user204069 - какова ваша ценность сеанса? Вы выполняете неявное преобразование из строки в дату, которую вы должны избегать, поскольку это неоднозначно. Вы должны использовать 'to_date ('06/26/2013 ',' MM/DD/YYYY ')'. Или, возможно, «date» 2013-06-26'', используя литерал даты ANSI. –

Смежные вопросы