Как отобразить ДАТУ в формате «ДД МЕСЯЦ ГГГГ»?

Я новичок в программировании баз данных Oracle и хочу ВСТАВИТЬ дату (также отображать) в формате «DD MON YYYY». (PS: это касается только события INSERT). Какой тип данных (DATE или TIMESTAMP) является наиболее подходящим вариантом для реализации этого формата? Как я должен был это сделать? Спасибо.


person user3781895    schedule 27.06.2014    source источник
comment
Скорее всего, вам нужно будет сделать это вручную, т.е. использовать datepart + datepart + datepart.   -  person Anthony Horne    schedule 27.06.2014
comment
Что такое клиент в этом случае? Я бы использовал тип DATE в базе данных и выполнял весь синтаксический анализ и форматирование на клиенте.   -  person Jon Skeet    schedule 27.06.2014
comment
@Jon Skeet, если я выберу тип DATE и введу «INSERT INTO Table_Name VALUES (TO_DATE («27 июня 2014», «DD MON YYYY»));», вывод будет «27/06/2014», а не «27». Июнь 2014», как и ожидалось.   -  person user3781895    schedule 27.06.2014
comment
Вы упустили мою мысль. Вы вообще не должны отправлять или извлекать его из базы данных в виде строки. Выполните все преобразования текста на клиенте. Мы не можем легко помочь вам с этим, так как вы не сказали нам, что такое клиент.   -  person Jon Skeet    schedule 27.06.2014
comment
Не меняйте название вопроса, если на него есть ответ. Тот факт, что есть принятый ответ, будет помечать это как закрытое.   -  person a_horse_with_no_name    schedule 28.06.2014


Ответы (3)


Столбец DATE не имеет никакого формата.

Таким образом, формат, который вы используете при вставке или обновлении данных, не имеет значения для отображения этих данных (это одна из причин, по которой вам никогда не следует хранить дату в столбце VARCHAR).

Любой отформатированный вывод, который вы видите для столбца DATE в вашем инструменте SQL (например, SQL * Plus), применяется этим инструментом. Это не часть данных, хранящихся в этом столбце.

При предоставлении литерала даты вы должны либо использовать функцию to_date() с явной маской формата:

insert into some_table (some_date_column)
values (to_date('27-06-2014', 'dd-mm-yyyy'));

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

Я предпочитаю использовать литералы даты ANSI, потому что это немного меньше:

insert into some_table (some_date_column)
values (DATE '2014-06-27');

Формат литерала даты (или метки времени) ANSI всегда соответствует формату ISO (гггг-мм-дд).

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

select to_char(some_date_column,'dd-mon-yyyy')
from some_table;

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

person a_horse_with_no_name    schedule 27.06.2014
comment
@ user3781895: тогда вам нужно проверить настройки APEX для формата даты по умолчанию. Как я уже сказал: DATE хранится без какого-либо формата. Это приложение применяет это форматирование (клиентские инструменты Oracle, как правило, используют настройки NLS из переменных среды - я не знаю, как это делает APEX) - person a_horse_with_no_name; 27.06.2014
comment
@user3781895 user3781895 У меня нет опыта работы с APEX, вам нужно будет проверить руководство APEX (или задать другой вопрос о том, как изменить формат отображения даты в APEX) - person a_horse_with_no_name; 27.06.2014

Чтобы вставить запись,

INSERT INTO TABLE_NAME (DATE_FIELD) VALUES (TO_DATE ('27-JUN-2014', 'DD-MON-YYYY');

Рекомендуется использовать тип данных DATE до тех пор, пока вам не понадобится точность даты до миллисекунд. В вашем случае используйте тип данных DATE, а TIMESTAMP не требуется.

Чтобы выбрать запись,

SELECT TO_CHAR(DATE_FIELD, 'DD-MON-YYYY') FROM TABLE_NAME;

В общем, запомните это:

  • TO_DATE – это функция, используемая для преобразования строки (CHAR) в дату.
  • TO_CHAR – это функция, используемая для преобразования DATE в строку (CHAR).
person Nishanthi Grashia    schedule 27.06.2014
comment
Каким образом будет вывод? Вы используете запрос выбора, указанный в моем ответе? - person Nishanthi Grashia; 27.06.2014

В этом сценарии вам подойдет тип данных даты, и для желаемого формата вы должны попробовать следующее:

 INSERT INTO TABLE_NAME(DATE_COLUMN) VALUES('27-JUN-2014');

Надеюсь, это поможет вам.

person Ankit Bajpai    schedule 27.06.2014
comment
Это плохой стиль. Он основан на неявном преобразовании типов данных на основе настроек NLS клиента и сервера. Ваше заявление будет, например. сбой на моем компьютере. - person a_horse_with_no_name; 27.06.2014
comment
Но я всегда использовал формат даты в оракуле. и очень часто я использовал это. И не могли бы вы подробнее рассказать об этом. - person Ankit Bajpai; 27.06.2014