Формат даты Oracle по умолчанию-гггг-ММ-ДД, почему?

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

 select some_date from some_table

...Я!--5-->теряет часть времени моего дня.

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

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

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

12 ответов


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

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

вы уверены, что не путаете Oracle database с Oracle SQL Developer?

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

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


формат гггг-ММ-ДД является частью в формате iso8601 стандарт для обмена информацией о дате (и времени).

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

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

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


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

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

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

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

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


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

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


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

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

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

формат даты: гггг-ММ-ДД HH24: MI: SS


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

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

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


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


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

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


Oracle имеет типы данных даты и метки времени.

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

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


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

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

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

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

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

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


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

Oracle команды состоят из ленивых разработчиков или ответственных: -)

почему ?

потому что дата, время и datetime типы данных существуют в SQL и Oracle еще не реализовал его !!!

Это позор для Oracle.

но правильный ответ на вашу проблему-не определить формат исправления по умолчанию, а Значимый формат по умолчанию, который отображает только значимые цифры, чтобы отображаемые значения даты, времени или времени (по умолчанию) всегда содержали все важные цифры.

пример:

2015-10-14          will be displayed as 2015-10-14 (or default DATE format)
2018-10-25 12:20:00 will be displayed as 2018-10-25 12:20
1994-04-16 16       will be displayed as 1994-04-16 16

принцип прост.

все цифры, являющиеся частью даты, всегда будут отображаться как целочисленная часть числа float. Для части времени только значительная часть будет отображаться как для десятичной части в номере float. Естественно, для типа времени (только HH: MM: SS), часть даты никогда не показывается.