Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简化两个日期之间月份的计算(postgresql)_Postgresql_Date_Postgresql 9.1 - Fatal编程技术网

简化两个日期之间月份的计算(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');