Тип данных для даты в PostgreSQL

Я экспортировал файл CSV из Excel, который имеет дату в формате ддммгггг хмм. Я использую функцию COPY для импорта в таблицу в PostgreSQL.

Поскольку я хочу сохранить только часть даты, я попробовал тип данных date:

CREATE TABLE Public."ride_details"(ride_id int,created_at date)

COPY Public."ride_details" FROM '/tmp/ride_details.csv' DELIMITER ',' csv HEADER;

Но в результате получилось:

ОШИБКА: значение поля даты/времени вне диапазона: "26/07/19 5:48"
ПОДСКАЗКА: Возможно, вам нужна другая настройка "datestyle".
КОНТЕКСТ: КОПИРОВАТЬ ride_details, строка 2, столбец created_at: "26/07/19 5:48"
Состояние SQL: 22008

Нужно ли указывать другой тип данных или как это сделать?


person ANKIT BISHT    schedule 21.08.2019    source источник
comment
@ErwinBrandstetter большое спасибо, вы решили мой вопрос. :D   -  person ANKIT BISHT    schedule 22.08.2019
comment
Обратите внимание на добавленные биты!   -  person Erwin Brandstetter    schedule 22.08.2019


Ответы (1)


COPY довольно неумолим с недопустимым вводом. (Таким образом, это может быть быстро и надежно.)

может быть достаточно установить соответствующий datestyle:

SET datestyle = 'ISO,DMY';  -- DMY being the relevant part

... и повторите попытку. (Устанавливает настройку только для вашего сеанса.) Связанные:

Информация в вашем вопросе не совсем ясна, вам, возможно, придется сделать больше:
скопировать во временную "промежуточную" таблицу со столбцом text, а оттуда INSERT в реальную целевую таблицу, используя to_date() - с пользовательским шаблоном, указывающим ваш нестандартный формат даты:

CREATE TABLE public.ride_details(ride_id int,created_at date); -- target table

CREATE TABLE pg_temp.step1(ride_id int, created_at text); -- temporary staging table

COPY TO pg_temp.step1 ...;

INSERT INTO public.ride_details(ride_id, created_at)
SELECT ride_id, to_date(created_at, 'DD/MM/YY') -- or whatever
FROM   pg_temp.step1;

to_date() игнорирует висячие символы после заданного шаблона , поэтому нам не нужно иметь дело с вашей странной спецификацией hmm (hh?).

Я выбрал формат YY, отображаемый в сообщении об ошибке, а не yyyy, о котором вы говорите вверху. В любом случае ввод должен быть в непротиворечивом формате, иначе вам нужно сделать больше, но...

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

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

Связанный:

person Erwin Brandstetter    schedule 21.08.2019