Формат даты по умолчанию Oracle - ГГГГ-ММ-ДД, ПОЧЕМУ?

64

Формат даты по умолчанию Oracle - YYYY-MM-DD. Что означает, если я это сделаю:

 select some_date from some_table

... Я теряю часть моего времени.

Да, я знаю, что вы можете "исправить" это с помощью:

 alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Но серьезно, почему это не по умолчанию? Особенно в СУБД, где два основных типа данных отслеживания времени (DATE и TIMESTAMP) имеют временной компонент, который включает (по крайней мере) точность до 1 секунды.

  • 3
    пожалуйста, не закрывайте; Я бы очень хотел получить объяснение / объяснение от опытного члена сообщества Oracle.
  • 7
    Точность не теряется - она просто не отображается. У каждого БД есть свои причуды - это наименьшее из моих опасений. IMO: Отсутствие неявного преобразования типов данных в SQL Server - это большая PITA.
Показать ещё 10 комментариев
Теги:
date-formatting

11 ответов

50
Лучший ответ

Если вы используете этот запрос для создания входного файла для вашего хранилища данных, вам необходимо соответствующим образом отформатировать данные. По существу, в этом случае вы преобразуете дату (которая имеет компонент времени) в строку. Вам нужно явно форматировать строку или изменить nls_date_format, чтобы установить значение по умолчанию. В вашем запросе вы можете просто:

select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date
  from some_table;
78

Вы уверены, что не смешиваете базу данных Oracle с Oracle SQL Developer?

В самой базе данных нет формата даты, дата выводится из базы данных в необработанном виде. Это для клиентского программного обеспечения для его рендеринга, и SQL Developer действительно использует YYYY-MM-DD в качестве формата по умолчанию, который находится рядом с бесполезным, я согласен.

edit: как было отмечено ниже, SQL Developer может быть перенастроен для правильного отображения значений DATE, у него просто плохие значения по умолчанию.

  • 32
    В SQL Developer, Инструменты> Предпочтения> База данных> Параметры NLS ... есть тринадцать параметров, которые можно установить для управления значениями по умолчанию.
  • 0
    Ох, версия 1.5.5 то есть.
Показать ещё 2 комментария
21

Формат YYYY-MM-DD является частью ISO8601 стандарта обмена информацией о дате (и времени).

Очень храбрый Oracle, чтобы принять стандарт ISO, как это, но в то же время странно, что они не прошли весь путь.

В целом люди сопротивляются чему-то другому, но есть много хороших международных причин для него.

Я знаю, что я говорю о революционных вещах, но мы все должны использовать стандарты ИСО, даже если мы делаем это немного за раз.

11

Самая большая PITA Oracle - это не формат даты по умолчанию!

В вашей установке Oracle сочетание локалей и параметров установки выбрало (очень разумный!) YYYY-MM-DD как формат вывода дат. Другая установка могла бы выбрать "DD/MM/YYYY" или "YYYY/DD/MM".

Если вы хотите, чтобы ваш SQL был переносимым на другой сайт Oracle, я бы рекомендовал вам always обернуть TO_CHAR(datecol,'YYYY-MM-DD') или подобную функцию вокруг каждого столбца даты вашего SQL или альтернативно установить формат defualt сразу после вас подключиться с помощью

ALTER SESSION 
SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; 

или аналогичный.

  • 4
    Администратор базы данных может установить любой NLS_DATE_FORMAT для всей системы, который он хочет. Однако часто база данных просто возвращает значение в семибайтовом внутреннем формате даты, и клиентское программное обеспечение выполняет свою собственную работу по переводу этого значения в строку.
  • 0
    Если у Oracle должен был быть жестко заданный формат даты по умолчанию, пожалуйста, скажите мне - какой он должен быть? И как вы предлагаете объяснить это всем людям в мире, которые хотят, чтобы это было что-то еще? (Всегда найдется кто-то, кто не доволен принятием решения!). У Oracle нет жестко заданного формата даты по умолчанию, потому что Oracle - это коммерческий продукт, который пытается удовлетворить требования всех пользователей.
Показать ещё 1 комментарий
9

Никогда не следует полагаться на значения по умолчанию, заданные для определенного значения, IMHO, будь то форматы дат, форматы валют, режимы оптимизатора или что-то еще. Вы всегда должны установить значение формата даты, которое вам нужно, на сервере, клиенте или приложении.

В частности, никогда не полагайтесь на значения по умолчанию при преобразовании даты или числовых типов данных для целей показа, потому что одно изменение базы данных может разорвать ваше приложение. Всегда используйте явный формат преобразования. В течение многих лет я работал над системами Oracle, где формат отображения даты по умолчанию был MM/DD/RR, который приводил меня в состояние ореха, но по крайней мере заставлял меня всегда использовать явное преобразование.

5

В большинстве IDE вы можете настроить маску по умолчанию для данных определенного типа как дату, валюту, десятичный разделитель и т.д.

Если вы используете Oracle SQL Developer:

Инструмент > Настройки > База данных > NLS

Формат даты: ГГГГ-ММ-ДД HH24: MI: SS

5

Это "проблема" на стороне клиента, а не проблема Oracle.

Это клиентское приложение, которое форматирует и отображает дату таким образом.

В вашем случае это SQL * Plus, который делает это форматирование.
Другие SQL-клиенты имеют другие значения по умолчанию.

4

Значение DATE для стандарта SQL - YYYY-MM-DD. Поэтому, несмотря на то, что Oracle хранит информацию о времени, я предполагаю, что они отображают значение таким образом, который совместим со стандартом SQL. В стандарте есть тип данных TIMESTAMP, который включает информацию о дате и времени.

2

Я не являюсь пользователем Oracle (ну, в последнее время так или иначе), НО...

В большинстве баз данных (и в точном языке) дата не включает время. Наличие даты не означает, что вы указываете конкретную секунду в эту дату. Обычно, если вы хотите время, а также дату, которая называется временной меткой.

  • 2
    Ник, спасибо за ответ. Я согласен с вами концептуально. Похоже, два типа Oracle, DATE vs TIMESTAMP, оба имеют компонент времени. Просто в TIMESTAMP снижается степень детализации (до 1 секунды). it.toolbox.com/blogs/database-solutions/… Вы могли бы подумать, что включение компонента времени в оба типа будет причиной отсутствия формата отображения YYYY-MM-DD.
  • 3
    @Nick: Тип Oracle DATE имеет точность в одну секунду. Это плохо названо.
Показать ещё 1 комментарий
1

Причина: если вы просматриваете столбец данных с отметкой времени, бит информации _MOST_IMPORTANT_ - это год. Если данные были в db в течение десяти лет, это важно знать. поэтому год наступает первым.

имеет смысл, что месяц будет следующим, затем день, час, минута. Объективно это наиболее логичная последовательность для отображения данных времени.

также имеет смысл, что если вы собираетесь отображать данные по умолчанию, вы должны отображать только самую значительную часть данных, поэтому по умолчанию используется только Y-M-D. все остальное МОЖЕТ отображаться, но по умолчанию он не загромождает ваш SQL-отчет.

Заказ по дате логичен, если вы показываете Y-M-D, потому что он является последовательным. Компьютеры хороши в последовательности, и это выглядит логичным.

в конце концов. Ваш смещение, чтобы хотеть M-D-Y, - это ваше предвзятое отношение. Не все, даже в США, используют этот формат. Поэтому используйте наиболее логичный формат и не будьте оскорблены, когда другие решают быть логичными по умолчанию.

(Я родился в США, и я не представляю Oracle. Я могу, однако, подумать обо мне)

1

Oracle имеет как типы данных Date, так и Timestamp.

Согласно Документация Oracle, существуют различия в размере данных между Date и Timestamp, поэтому, когда цель состоит в том, чтобы иметь поле "Только дата", имеет смысл показать форматирование даты. Кроме того, "У него нет дробных секунд или часового пояса". - так что это не лучший выбор, когда требуется информация о временной отметке.

Поле Date можно легко отформатировать, чтобы показать компонент времени в Oracle SQL Developer - Запрос даты, запущенный в PL/SQL Developer показывает время, но не отображается в Oracle SQL Developer. Но он не покажет дробные секунды или часовой пояс - для этого вам нужен тип данных Timestamp.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню