如何修改PostgreSQL日期差值查询以在Amazon Redshift中计算库存日期与固定日期的精确月份差?
解决Amazon Redshift中精确计算库存月份差值的问题
我明白你遇到的问题了——PostgreSQL里用age()函数写的查询到Redshift里就报错,这是因为Redshift对PostgreSQL的部分日期函数支持有限,咱们换个Redshift认的写法就行。
问题原因
Redshift并没有完全兼容PostgreSQL的age()函数用法,尤其是结合EXTRACT()获取年/月差值的场景,所以得改用Redshift原生支持的日期计算方式来实现同样的精确月份差逻辑。
适配Redshift的查询语句
直接通过提取日期的年、月、日部分来计算,同时处理“日部分超过目标日期”的情况,保证结果和你预期的一致:
SELECT iv.product_name, ( DATE_PART('year', '2020-12-20'::date) - DATE_PART('year', MAX(iv.inventory_date::date)) ) * 12 + ( DATE_PART('month', '2020-12-20'::date) - DATE_PART('month', MAX(iv.inventory_date::date)) ) - CASE WHEN DATE_PART('day', MAX(iv.inventory_date::date)) > DATE_PART('day', '2020-12-20'::date) THEN 1 ELSE 0 END AS months_in_inventory FROM inventory iv GROUP BY iv.product_name ORDER BY iv.product_name;
逻辑拆解(和原PostgreSQL查询对齐)
咱们一步步看为什么这么写能得到预期结果:
- 年份差转月份:先计算目标日期和库存日期的年份差,乘以12转换成月份数(比如同一年的话这部分就是0);
- 加上月份差:直接计算两个日期的月份差值,加到年份差转换的月份数中;
- 日部分修正:用
CASE语句判断,如果库存日期的日比目标日(20号)大(比如Product_B的22号),就减去1个月,这样就能得到精确的“满月份数”,完全匹配你要的结果。
执行结果
跑这个查询后,就能得到你想要的输出:
product_name | months_in_inventory -------------|--------------------- Product_A | 2 Product_B | 1 Product_C | 1 Product_D | 0
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

