sql - 计算两个日期之间的精确月差
问题描述
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_date
和inventory_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;
但是,我不知道如何将其更改为月份的差异。你有什么主意吗?
笔记
我知道解决这个问题的一种方法是month
从fixed_date
and中提取inventory_date
并减去这两个数字。但是,这不会给我正确的结果,因为我需要它完全基于日期。
例如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。
推荐阅读
- java - 未使用 @RequiredArgsConstuctor 注释注入的最终变量
- matlab - 使用 MATLAB 测量微观粒子的 Feret 直径
- elasticsearch - updateSearchIndexConfig.php
- docker - 容器无法连接到互联网
- javascript - 参数列表后缺少错误 - Selenium Python(执行 Javascript)
- ios - 我是否需要物理 iPhone 来编译和分发 IOS 应用程序?
- c# - 错误:未定义或导入预定义类型“System.Range”
- python - VSCode FileNotFoundError
- haskell - 如何让 GHCi 重新加载包括本地依赖库中的更改?
- java - Spring Boot 应用程序问题