【问题标题】:Simplify calculation of months between 2 dates (postgresql)简化两个日期之间月份的计算(postgresql)
【发布时间】:2016-08-16 09:18:47
【问题描述】:

这个问题被问了很多次,而在两个日期之间获得月份的建议查询之一不起作用。

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(我认为):

DATEDIFF(month, date1, date2)

在 Postgresql 中是否没有简单的方法(如上)来计算两个日期之间的月份?如果可能的话,我宁愿不使用函数。

【问题讨论】:

  • 不幸的是,我不认为 POSTGRES 提供了一种简单的方法来查找两个日期之间的月差,你的方法很好,你也可以看这里 -> sqlines.com/postgresql/how-to/datediff 。问题是什么?您的查询速度慢吗?
  • 创建自定义函数的可能性是一个强大的功能,厌恶使用它们很难理解。
  • @klin 实际上并不难。 OP 询问是否有基本功能来执行此操作,而不是是否可以创建此功能。他们不是一定说他们不会使用函数,而是说“使用函数”不是对要求基本特性的问题的有效答案。
  • @PhilipCouling - 我写的不是对问题的有效答案,而是评论。
  • 在处理 500 多个数据库时使用自定义函数不是我想到的第一个选项。我只想在这样做之前探索所有可能性。关于如何创建自定义函数的任何提示?

标签: postgresql date postgresql-9.1


【解决方案1】:

这将为您提供两个日期之间的月数,不包括天数。

CREATE OR REPLACE FUNCTION get_months_between(to_date date, from_date date) RETURNS double precision AS $$
    SELECT (date_part ('year', to_date) * 12 + date_part ('month', to_date)) - (date_part ('year', from_date) * 12 + date_part ('month', from_date))

$$ LANGUAGE SQL IMMUTABLE;

【讨论】:

    【解决方案2】:

    不幸的是,您已经有了最优雅的解决方案。

    如果您查看extract 的文档(与date_part 相同):

    https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT

    对于时间戳值,一年中的月份数(1 - 12);对于间隔值,月数,模 12 (0 - 11)

    SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
    Result: 2
    
    SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months');
    Result: 3
    
    SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
    Result: 1
    

    对于您的问题,如果 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'));
    

    或者

    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');
    

    您实际上可以创建两者,然后使用适合您的代码的任何一个。

    【讨论】:

      猜你喜欢
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      相关资源
      最近更新 更多