Формат даты по умолчанию Oracle: ГГГГ-ММ-ДД, ПОЧЕМУ? - PullRequest
67 голосов
/ 03 декабря 2009

Формат даты по умолчанию Oracle - ГГГГ-ММ-ДД. Что означает, если я сделаю:

 select some_date from some_table

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

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

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

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

Ответы [ 12 ]

81 голосов
/ 03 декабря 2009

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

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

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

53 голосов
/ 03 декабря 2009

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

select to_char(some_date, 'yyyy-mm-dd hh24:mi:ss') my_date
  from some_table;
21 голосов
/ 03 декабря 2009

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

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

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

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

12 голосов
/ 03 декабря 2009

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

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

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

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

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

9 голосов
/ 03 декабря 2009

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

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

7 голосов
/ 02 сентября 2014

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

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

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

Формат даты: ГГГГ-ММ-ДД ЧЧ24: MI: СС

5 голосов
/ 06 января 2011

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

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

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

4 голосов
/ 03 декабря 2009

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

2 голосов
/ 03 декабря 2009

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

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

1 голос
/ 30 декабря 2014

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

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

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

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

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

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

...