Подтвердить что ты не робот

Как изменить формат даты в Postgres?

Я получаю следующее сообщение об ошибке

ОШИБКА: значение поля даты/времени вне диапазона: "13/01/2010" СОВЕТ. Возможно, вам нужна другая настройка "datestyle".

Я хочу получить свою дату в формате DD/MM/YYYY

4b9b3361

Ответ 1

SHOW datestyle;

 DateStyle 
-----------
 ISO, MDY
(1 row)

INSERT INTO container VALUES ('13/01/2010');
ERROR:  date/time field value out of range: "13/01/2010"
HINT:  Perhaps you need a different "datestyle" setting.

SET datestyle = "ISO, DMY";
SET

INSERT INTO container VALUES ('13/01/2010');
INSERT 0 1

SET datestyle = default;
SET

http://www.postgresql.org/docs/current/static/runtime-config-client.html#GUC-DATESTYLE

DateStyle - устанавливает формат отображения для значений даты и времени, а также правила для толкования двусмысленных даты. По историческим причинам эта переменная содержит два независимых компонента: спецификация выходного формата (ISO, Postgres, SQL или немецкий язык) и спецификация ввода/вывода для год/месяц/день (DMY, MDY или ГМД).

Конечно, лучше всего использовать однозначный формат ввода (ISO 8601), но нет никаких проблем с его настройкой по мере необходимости.

Ответ 2

Вы можете установить стиль даты для европейского (дд/мм/гггг):

SET DateStyle TO European;

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

Ответ 3

Edit:

При использовании этого COPY допустимый формат ввода определяется конфигурацией сервера и может быть изменен для текущего сеанса с помощью команды SET, как описано Berry, или путем настройки конфигурации сервера.

Описание DateStyle в руководстве:
http://www.postgresql.org/docs/current/static/runtime-config-client.html#GUC-DATESTYLE

Следующие действия недействительны для реальной ситуации, но я все равно сохраняю ее для справки

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

Стандарт ANSI SQL для литералов даты выглядит следующим образом:

UPDATE some_table
   SET date_column = DATE '2011-05-25'
WHERE pk_column = 42;

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

UPDATE some_table
   SET date_column = to_date('13/01/2010', 'dd/mm/yyyy')
WHERE pk_column = 42;

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