在psql中执行含SELECT语句的COPY命令时出现‘column "gmt" does not exist’错误
解决PostgreSQL
AT TIME ZONE 时区列不存在的错误 嘿,这个问题我碰到过好多次!你遇到的错误根源很简单:PostgreSQL把你写的GMT当成了一个列名,而不是时区标识符——因为使用AT TIME ZONE语法时,时区名称必须用单引号括起来,不然数据库会误以为你要引用某个叫GMT的列。
修正后的命令
你可以用两种方式快速修复:
- 转义单引号(适合外层用单引号的场景):
psql -c '\COPY (SELECT file_name, status, reported, operator_id, load_dt AT TIME ZONE '\''GMT'\'') FROM mytable) TO STDOUT' > myfile
- 改用双引号包裹整个psql命令(更简洁,避免转义麻烦):
psql -c "\COPY (SELECT file_name, status, reported, operator_id, load_dt AT TIME ZONE 'GMT' FROM mytable) TO STDOUT" > myfile
为什么这样能解决问题?
- 当你用单引号包裹psql的
-c参数内容时,shell会把内部的单引号视为字符串的结束标记,所以必须转义才能让PostgreSQL识别到'GMT'是一个时区字符串。 - 改用双引号包裹外层命令后,内部的单引号不需要转义,PostgreSQL就能正确解析
AT TIME ZONE 'GMT'的含义,把load_dt转换为GMT时区的时间。
额外小提示
如果你不确定哪些时区名称是有效的,可以在psql里执行这个查询查看所有支持的时区:
SELECT name FROM pg_timezone_names;
比如你也可以用'UTC'或者更具体的时区如'Europe/London'来替代'GMT'。
内容的提问来源于stack exchange,提问作者BT3
相关产品推荐
相关产品推荐

