[英]Calculate exact month-difference between two dates
CREATE TABLE inventory
(
id SERIAL PRIMARY KEY,
inventory_date DATE,
product_name VARCHAR(255),
product_value VARCHAR(255)
);
INSERT INTO inventory (inventory_date, product_name, product_value)
VALUES ('2020-10-19', 'Product_A', '400'),
('2020-10-22', 'Product_B', '400'),
('2020-11-20', 'Product_C', '900'),
('2020-11-25', 'Product_D', '300');
预期结果:
product_name | months_in_inventory
-------------+--------------------
Product_A | 2
Product_B | 1
Product_C | 1
Product_D | 0
我想通过计算months_in_inventory
和inventory_date
之间的差异来计算fixed_date
。
在示例中, fixed_date
是'2020-12-20'
,我正在使用它进行查询。
到目前为止,我能够计算出天数的差异:
SELECT
iv.product_name,
'2020-12-20'::date - MAX(iv.inventory_date::date) AS days_in_inventory
FROM
inventory iv
GROUP BY
1
ORDER BY
1;
但是,我不知道如何将其更改为月份的差异。 你有什么主意吗?
笔记
我知道解决这个问题的一种方法是从fixed_date
和inventory_date
中提取month
并减去这两个数字。 但是,这不会给我正确的结果,因为我需要它完全基于日期。
例如Product_B
库存只有1 month
,因为2020-10-22
与2020-12-20
相比不是两个月。
您可以使用age()
。 如果该值始终小于 12 个月,则一种方法是:
SELECT iv.product_name,
extract(month form age('2020-12-20'::date, MAX(iv.inventory_date::date))) AS months_in_inventory
FROM inventory iv
GROUP BY 1
ORDER BY 1;
更准确的计算将年份考虑在内:
SELECT iv.product_name,
(extract(year from age('2020-12-20'::date, MAX(iv.inventory_date::date))) * 12 +
extract(month from age('2020-12-20'::date, MAX(iv.inventory_date::date)))
) AS months_in_inventory
FROM inventory iv
GROUP BY 1
ORDER BY 1;
这是一个 db<>fiddle。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.