postgres日期之间的双精度月数

时间:2016-06-14 16:39:55

标签: postgresql timestamp double date-difference

是否可以将两个日期之间的月数计算为双精度而不是整数?例如,2016-05-042015-03-21之间的区别是13.42还是13.43个月?

2 个答案:

答案 0 :(得分:1)

有许多方法可以计算类似的东西,并且根据您用于计算的规则,您会得到不同的结果。

以下方式为您提供两个日期之间给定时段的一年中的12个数字:

select (date'2016-05-04' - date'2015-03-21') / 365.0 * 12

以上结果为13.48。

以下方法给出了一个更准确的数字(13.47),虽然要复杂得多,但差别很小:

select extract('years' from age) * 12 + extract('months' from age) + extract('days' from age) / 30
from (select age('2016-05-04'::timestamp, '2015-03-21'::timestamp)) a

答案 1 :(得分:0)

对于那些对精确计算感兴趣的人,我编写了以下函数来计算两个月中两个日期之间的差,包括小数部分:

CREATE FUNCTION
  MONTH_FRACTION(
      from_date DATE
    , to_date DATE
  )

  RETURNS REAL

  AS
    $$
      WITH
          aux_1 AS (  -- Auxiliary table
            SELECT
                AGE(to_date, from_date) AS duration
          )

        , aux_2 AS (  -- Auxiliary table
            SELECT
                (from_date + DATE_TRUNC('MONTH', duration))::DATE AS to_date_floor
              , (from_date + DATE_TRUNC('MONTH', duration + INTERVAL '1 MONTH'))::DATE AS to_date_ceil
            FROM
              aux_1
          )

      SELECT
        CASE WHEN
          to_date >= from_date
        THEN
          (12 * EXTRACT(YEAR FROM duration) + EXTRACT(MONTH FROM duration) + (to_date - to_date_floor)::REAL / (to_date_ceil - to_date_floor)::REAL)::REAL
        ELSE
          NULL
        END

      FROM
        aux_1, aux_2
    $$

  LANGUAGE SQL
  IMMUTABLE
  RETURNS NULL ON NULL INPUT;