PostgreSQL导出CSV时timestamp without timezone列数据异常的解决方法
解决PostgreSQL导出timestamp without timezone时丢失日期和小数部分的问题
要保留timestamp without timezone类型列的完整时间数据(包括日期、时分秒及微秒部分),你需要在导出的SELECT语句中显式指定时间格式,避免依赖PostgreSQL的默认格式设置。
修正后的导出语句
把原来的SELECT *替换为指定列,并使用to_char函数将时间列格式化为完整的字符串:
COPY ( SELECT id, public_id, -- 显式指定时间格式,保留日期、时分秒和微秒 to_char(created_at_utc, 'YYYY-MM-DD HH24:MI:SS.US') AS created_at_utc, to_char(updated_at_utc, 'YYYY-MM-DD HH24:MI:SS.US') AS updated_at_utc, -- 补充表中其他需要导出的字段 other_column1, other_column2 FROM public.carrier_booking ) TO 'C:\Users\Public\A.csv' WITH CSV HEADER;
格式说明:
YYYY-MM-DD:完整日期(年-月-日)HH24:MI:SS:24小时制的时分秒.US:保留微秒部分(最多6位小数)
对应的导入语句
导出的CSV中时间列是标准格式的字符串,PostgreSQL可以自动解析为timestamp without timezone类型,直接使用正常的导入语句即可:
COPY public.carrier_booking FROM 'C:\Users\Public\A.csv' DELIMITER ',' CSV HEADER;
为什么默认导出会丢失数据?
PostgreSQL的COPY命令默认使用客户端的datestyle配置来格式化时间类型。如果你的客户端datestyle设置为仅显示时间部分(比如非标准的配置),就会导致日期和微秒部分被截断。显式使用to_char可以彻底避免这种环境依赖问题,确保导出的时间格式完全符合需求。
内容的提问来源于stack exchange,提问作者ladsaylee
相关产品推荐
相关产品推荐

