繁体   English   中英

计算两个日期之间的精确月差

[英]Calculate exact month-difference between two dates

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_inventoryinventory_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_dateinventory_date中提取month并减去这两个数字。 但是,这不会给我正确的结果,因为我需要它完全基于日期。

例如Product_B库存只有1 month ,因为2020-10-222020-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM