42

2 つの日付の間の月数を数えたい。

やっている:

SELECT TIMESTAMP '2012-06-13 10:38:40' - TIMESTAMP '2011-04-30 14:38:40';

戻り値: 0 年 0 月 409 日 20 時間 0 分 0.00 秒

など:

SELECT extract(month from TIMESTAMP '2012-06-13 10:38:40' - TIMESTAMP '2011-04-30 14:38:40');

0 を返します。

4

12 に答える 12

19

このage関数は、動作する正当な間隔を提供します。

SELECT age(TIMESTAMP '2012-06-13 10:38:40', TIMESTAMP '2011-04-30 14:38:40');

を返します。これを使用して、月数を1 year 1 mon 12 days 20:00:00簡単に数えることができます。EXTRACT

SELECT EXTRACT(YEAR FROM age) * 12 + EXTRACT(MONTH FROM age) AS months_between
FROM age(TIMESTAMP '2012-06-13 10:38:40', TIMESTAMP '2011-04-30 14:38:40') AS t(age);
于 2014-02-17T02:31:43.970 に答える
8

これを複数回行う場合は、次の関数を定義できます。

CREATE FUNCTION months_between (t_start timestamp, t_end timestamp)
    RETURNS integer
    AS $$
        SELECT
            (
                12 * extract('years' from a.i) + extract('months' from a.i)
            )::integer
        from (
            values (justify_interval($2 - $1))
        ) as a (i)
    $$
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;

あなたができるように

SELECT months_between('2015-01-01', now());
于 2015-07-07T08:32:50.963 に答える
2

2 つの日付の月の差を返します

   SELECT ((extract( year FROM TIMESTAMP '2012-06-13 10:38:40' ) - extract( year FROM TIMESTAMP '2011-04-30 14:38:40' )) *12) + extract(MONTH FROM TIMESTAMP '2012-06-13 10:38:40' ) - extract(MONTH FROM TIMESTAMP '2011-04-30 14:38:40' );

結果 : 14

両方の日付に対して月を別々に抽出し、両方の結果の差を抽出する必要があります

于 2012-06-13T10:25:42.100 に答える
1

私は昔々同じ問題を抱えていて、これを書きました...それはかなり醜いです:

postgres=>  SELECT floor((extract(EPOCH FROM TIMESTAMP '2012-06-13 10:38:40' ) - extract(EPOCH FROM TIMESTAMP '2005-04-30 14:38:40' ))/30.43/24/3600);
 floor 
-------
    85
(1 row)

このソリューションでは、「1 か月」は 30.43 日の長さと定義されているため、短い期間で予期しない結果が生じる可能性があります。

于 2012-06-13T10:32:26.417 に答える
-2

試す;

select extract(month from  age('2012-06-13 10:38:40'::timestamp, '2011-04-30 14:38:40'::timestamp)) as my_months; 
于 2012-08-13T22:01:53.463 に答える