MONTHS_BETWEEN(date1,date2)
今回は、日付けに関するファンクションと列の値を返すファンクションについて紹介します。
MONTHS_BETWEENは、指定された日付date1からdate2までの月数を求める関数です(図13)。
SELECT MONTHS_BETWEEN('2003/03/15',
'2002/02/20') FROM DUAL;
MONTHS_BETWEEN('2003/03/15','2002/02/20')
-----------------------------------------
12.8387097
SELECT MONTHS_BETWEEN('2003/03/20',
'2002/02/20') FROM DUAL;
MONTHS_BETWEEN('2003/03/20','2002/02/20')
-----------------------------------------
13 次のコードは、その結果を得るためのストアドファンクションです。
CREATE FUNCTION MONTHS_BETWEEN(DATE,DATE)
RETURNS NUMERIC AS
'SELECT to_number((date($1)-date($2)),
''999999999'')/31 '
LANGUAGE 'sql';
結果は、以下のとおりです。
PostgreSQLでのMONTHS_BETWEEN関数の実行結果
SELECT MONTHS_BETWEEN('2003/03/15','2002/02/20');
months_between
----------------
12.5161290323
(1 row)
SELECT MONTHS_BETWEEN('2003/03/20','2002/02/20');
months_between
----------------
12.6774193548
(1 row)
実行例のように、計算結果に誤差が出る場合もあります。これについてはアプリケーション側で対応するなどの対処が必要です。
NEXT_DAY(date,string)
NEXT_DAYは指定された日付dateから出発してstringで指定された曜日の次の日付を求める関数です。
PostgreSQLではリスト7のようなストアドプロシージャで対応します。ただし、与えるパラメータは日本語だけとは限りませんので各国に合わせた処理が必要になります。ここでは日本語だけに対応することとします。

(画像をクリックすると別ウィンドウに拡大表示します)
ストアドプロシージャを再定義する場合には、次のように一度ドロップする必要がありますので注意してください。
DROP FUNCTION next_day(date,char);
DROP FUNCTION next_day(date,int);
Oracleでの実行結果を見てみましょう。
SQL> SELECT NEXT_DAY('2003/2/11','日') FROM DUAL;
NEXT_DAY
--------
03-02-16
PostgreSQLで作成されたNEXT_DAY関数の結果は次のとおりです。Oracleの例と比べてください。
# SELECT next_day('2003/2/11','日');
next_day
------------
2003-02-16
(1 row) ![]()