简化两个日期之间月份的计算(postgresql)
这个问题被问了很多次,其中一个建议的查询无法获得两个日期之间的月数简化两个日期之间月份的计算(postgresql),postgresql,date,postgresql-9.1,Postgresql,Date,Postgresql 9.1,这个问题被问了很多次,其中一个建议的查询无法获得两个日期之间的月数 SELECT date_part('month',age('2016-06-30', '2018-06-30')) 此查询的结果为0。应该是24个月。因为两个日期的月份都是06 这是可行的,但与sql server函数相比有点笨拙: SELECT date_part ('year', f) * 12 + date_part ('month', f) FROM age ('2016-06-30', '2018-06-30')
SELECT date_part('month',age('2016-06-30', '2018-06-30'))
此查询的结果为0。应该是24个月。因为两个日期的月份都是06
这是可行的,但与sql server函数相比有点笨拙:
SELECT date_part ('year', f) * 12 + date_part ('month', f)
FROM age ('2016-06-30', '2018-06-30') f
像sql server(我认为):
在Postgresql中,是否没有简单的方法(如上所述)来计算两个日期之间的月份?如果可能的话,我宁愿不使用函数。不幸的是,您已经有了最优雅的解决方案 如果您查看
摘录
(与日期部分
相同)的文档:
月
对于时间戳值,一年内的月数(1-12);对于区间值,月数,模12(0-11)
对于您的问题,如果有一个版本的month
不是模12,但它不存在,那就太好了
您拥有的选项(提取年份*12+个月)是最好的选项
编辑 如果确实要创建函数,请参见以下两个函数:
CREATE OR REPLACE FUNCTION get_months(i interval) RETURNS double precision AS $$
SELECT date_part ('year', i) * 12 + date_part ('month', i) ;
$$ LANGUAGE SQL IMMUTABLE;
SELECT get_months(age('2016-06-30', '2018-06-30'));
或
实际上,您可以创建这两个选项,然后使用适合您的代码的选项。不幸的是,您已经有了最优雅的解决方案 如果您查看
摘录
(与日期部分
相同)的文档:
月
对于时间戳值,一年内的月数(1-12);对于区间值,月数,模12(0-11)
对于您的问题,如果有一个版本的month
不是模12,但它不存在,那就太好了
您拥有的选项(提取年份*12+个月)是最好的选项
编辑 如果确实要创建函数,请参见以下两个函数:
CREATE OR REPLACE FUNCTION get_months(i interval) RETURNS double precision AS $$
SELECT date_part ('year', i) * 12 + date_part ('month', i) ;
$$ LANGUAGE SQL IMMUTABLE;
SELECT get_months(age('2016-06-30', '2018-06-30'));
或
实际上,您可以创建两个日期,然后只使用适合您的代码的任何一个。不幸的是,我认为POSTGRES没有提供一种简单的方法来查找两个日期之间的月差,您的方法很好,您也可以查看这里->。问题是什么?您的查询速度慢吗?创建自定义函数的可能性是一个强大的功能,不喜欢使用它们是很难理解的。@klin实际上不太难。OP询问是否有一个基本功能可以执行此操作,而不是是否可以创建此功能。他们不一定是说他们不会使用函数,而是说“使用函数”不是对要求基本功能的问题的有效答案。@PhilipCulling-我没有对问题给出有效答案,只是写了一条注释。在处理500多个数据库时,使用自定义函数不是我想到的第一个选项。在做这件事之前,我只想探索所有的可能性。关于如何创建自定义函数的任何提示?不幸的是,我不认为POSTGRES提供了一种简单的方法来查找两个日期之间的月差,您的方法很好,您也可以在这里查看->。问题是什么?您的查询速度慢吗?创建自定义函数的可能性是一个强大的功能,不喜欢使用它们是很难理解的。@klin实际上不太难。OP询问是否有一个基本功能可以执行此操作,而不是是否可以创建此功能。他们不一定是说他们不会使用函数,而是说“使用函数”不是对要求基本功能的问题的有效答案。@PhilipCulling-我没有对问题给出有效答案,只是写了一条注释。在处理500多个数据库时,使用自定义函数不是我想到的第一个选项。在做这件事之前,我只想探索所有的可能性。关于如何创建自定义函数的任何提示?
CREATE OR REPLACE FUNCTION get_months(i interval) RETURNS double precision AS $$
SELECT date_part ('year', i) * 12 + date_part ('month', i) ;
$$ LANGUAGE SQL IMMUTABLE;
SELECT get_months(age('2016-06-30', '2018-06-30'));
CREATE OR REPLACE FUNCTION get_months(to_date date, from_date date) RETURNS double precision AS $$
SELECT date_part ('year', f) * 12 + date_part ('month', f)
FROM age (to_date, from_date) f;
$$ LANGUAGE SQL IMMUTABLE;
SELECT get_months('2016-06-30', '2018-06-30');