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 を返します。
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 を返します。
この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);
これを複数回行う場合は、次の関数を定義できます。
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());
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
両方の日付に対して月を別々に抽出し、両方の結果の差を抽出する必要があります
私は昔々同じ問題を抱えていて、これを書きました...それはかなり醜いです:
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 日の長さと定義されているため、短い期間で予期しない結果が生じる可能性があります。
試す;
select extract(month from age('2012-06-13 10:38:40'::timestamp, '2011-04-30 14:38:40'::timestamp)) as my_months;