使用pgAdmin 4导入CSV时遇'malformed range literal'错误求助
问题原因与解决方案
核心错误原因
你把started_at和ended_at定义成了tsrange(时间范围类型),但CSV里的对应值是单个时间点(比如2023-08-01 00-00),完全不符合tsrange的格式要求:
tsrange需要的是包含起始、结束的范围格式,比如[2023-08-01 00:00:00, 2023-08-01 01:00:00)- 同时你的CSV时间格式还存在错误:
00-00应该是00:00(用冒号分隔时分)
另外你的表结构里还有两个拼写错误,建议一并修正:
rieable_type→ 应为rideable_typestart_staion_id→ 应为start_station_id
修复步骤
- 修改表结构的列类型:把
started_at和ended_at从tsrange改成单个时间戳类型,根据业务需求选择timestamp(无时区)或timestamptz(带时区):
CREATE TABLE IF NOT EXISTS public.aug2023_trip ( ride_id character varying(100) COLLATE pg_catalog."default", rideable_type character varying(100) COLLATE pg_catalog."default", started_at timestamp, ended_at timestamp, ride_length time without time zone, day_of_week smallint, start_station_name character varying(100) COLLATE pg_catalog."default", start_station_id character varying(100) COLLATE pg_catalog."default", end_station_name character varying(100) COLLATE pg_catalog."default", end_station_id character varying(100) COLLATE pg_catalog."default", start_lat numeric, start_lng numeric, end_lat numeric, end_lng numeric, member_casual character varying(50) COLLATE pg_catalog."default" ) TABLESPACE pg_default; ALTER TABLE IF EXISTS public.aug2023_trip OWNER to postgres;
修正CSV里的时间格式:把所有类似
2023-08-01 00-00的内容改成2023-08-01 00:00,确保是PostgreSQL能识别的标准时间戳格式。关于
ride_length的优化建议:如果ride_length是通过started_at和ended_at计算出来的时长,建议不要提前存在CSV里,而是导入数据后用SQL计算生成:
UPDATE public.aug2023_trip SET ride_length = ended_at - started_at;
这样可以避免数据冗余和计算错误。
内容的提问来源于stack exchange,提问作者Jason Neally
相关产品推荐
相关产品推荐

