首页 > 解决方案 > 计算两个日期之间的精确月差

问题描述

DB-小提琴

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通过计算 afixed_dateinventory_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;

但是,我不知道如何将其更改为月份的差异。你有什么主意吗?

笔记

我知道解决这个问题的一种方法是monthfixed_dateand中提取inventory_date并减去这两个数字。但是,这不会给我正确的结果,因为我需要它完全基于日期。

例如Product_B1 month在库存中,因为2020-10-22不是两个月比较2020-12-20

标签: sqlpostgresql

解决方案


您可以使用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。


推荐阅读