Superset中PostgreSQL DATE_TRUNC函数报错原因咨询
问题原因与解决方法
为什么DATE_TRUNC会报错?
PostgreSQL的DATE_TRUNC函数要求第二个参数必须是日期/时间类型(比如date、timestamp),但你的Order_Year字段是bigint整数类型(应该是直接存了2021、2022这种年份数字),PostgreSQL没有定义接受整数的DATE_TRUNC重载,所以触发了这个"函数不存在"的错误。
你的操作问题
你直接将整数类型的年份值传给了需要日期类型的DATE_TRUNC函数,没有做显式的类型转换,导致数据库无法识别该如何处理这个参数。
修正后的SQL
有两种常用的修正方式:
- 将整数年份转为日期类型后再使用
DATE_TRUNC:
SELECT DATE_TRUNC('year', TO_DATE("Order_Year"::text, 'YYYY')) AS __timestamp, "COST_TYPE" AS "COST_TYPE", sum("Average_Annual_Part_Cost") AS "SUM(Average_Annual_Part_Cost)" FROM "Part_Pricing_Unpivoted" GROUP BY "COST_TYPE", DATE_TRUNC('year', TO_DATE("Order_Year"::text, 'YYYY')) ORDER BY "SUM(Average_Annual_Part_Cost)" DESC LIMIT 10000;
这里先用::text把整数转成字符串,再用TO_DATE按年份格式转成date类型,最后传给DATE_TRUNC。
- 因为本身就是年份整数,也可以直接用
Order_Year作为时间维度(更简洁):
SELECT "Order_Year" AS __timestamp, "COST_TYPE" AS "COST_TYPE", sum("Average_Annual_Part_Cost") AS "SUM(Average_Annual_Part_Cost)" FROM "Part_Pricing_Unpivoted" GROUP BY "COST_TYPE", "Order_Year" ORDER BY "SUM(Average_Annual_Part_Cost)" DESC LIMIT 10000;
这种方式更直接,适合年份已经是整数的场景,同样能满足折线图的时间序列展示需求。
内容的提问来源于stack exchange,提问作者emalcolmb
相关产品推荐
相关产品推荐

