オラクルでは、MONTHS_BETWEEN関数を使用してno:of monthを見つけることができます。
postgres では、これに抽出関数を使用しています。例:
select
extract(year from age(current_date, '2012-12-09')) * 12
+
extract(month from age(current_date, '2012-12-09'))
postgresに他の方法(組み込み関数)はありますか??
オラクルでは、MONTHS_BETWEEN関数を使用してno:of monthを見つけることができます。
postgres では、これに抽出関数を使用しています。例:
select
extract(year from age(current_date, '2012-12-09')) * 12
+
extract(month from age(current_date, '2012-12-09'))
postgresに他の方法(組み込み関数)はありますか??
これは、SQL関数を使用して既に持っているものを整理するだけでPostgreSQLに簡単に再実装できます。
create function months_of(interval)
returns int strict immutable language sql as $$
select extract(years from $1)::int * 12 + extract(month from $1)::int
$$;
create function months_between(date, date)
returns int strict immutable language sql as $$
select abs(months_of(age($1, $2)))
$$;
そして今select months_between('1978-06-20', '2011-12-09')401を生成します。
残念ながら、そうではないようです。なぜなら、モジュロ 12extract(month ...)の月数を返すからです。
1 つの小さな単純化を行うことができます。の最初のパラメーターを削除しますage()- デフォルトは age fromcurrent_dateであるため、これら 2 つは同等です。
age(current_date, '2012-12-09')
age('2012-12-09')
UDF を使用できます。たとえば、ここで次のことがわかりました。
CREATE OR REPLACE FUNCTION DateDiff (units VARCHAR(30), start_t TIMESTAMP, end_t TIMESTAMP)
RETURNS INT AS $$
DECLARE
diff_interval INTERVAL;
diff INT = 0;
years_diff INT = 0;
BEGIN
IF units IN ('yy', 'yyyy', 'year', 'mm', 'm', 'month') THEN
years_diff = DATE_PART('year', end_t) - DATE_PART('year', start_t);
IF units IN ('yy', 'yyyy', 'year') THEN
-- SQL Server does not count full years passed (only difference between year parts)
RETURN years_diff;
ELSE
-- If end month is less than start month it will subtracted
RETURN years_diff * 12 + (DATE_PART('month', end_t) - DATE_PART('month', start_t));
END IF;
END IF;
-- Minus operator returns interval 'DDD days HH:MI:SS'
diff_interval = end_t - start_t;
diff = diff + DATE_PART('day', diff_interval);
IF units IN ('wk', 'ww', 'week') THEN
diff = diff/7;
RETURN diff;
END IF;
IF units IN ('dd', 'd', 'day') THEN
RETURN diff;
END IF;
diff = diff * 24 + DATE_PART('hour', diff_interval);
IF units IN ('hh', 'hour') THEN
RETURN diff;
END IF;
diff = diff * 60 + DATE_PART('minute', diff_interval);
IF units IN ('mi', 'n', 'minute') THEN
RETURN diff;
END IF;
diff = diff * 60 + DATE_PART('second', diff_interval);
RETURN diff;
END;
$$ LANGUAGE plpgsql;