PostgreSQLとOracleによるデータベース相互移行マニュアル 8

ファンクションの移行(2)

MONTHS_BETWEEN(date1,date2)   今回は、日付けに関するファンクションと列の値を返すファンクションについて紹介します。    MONTHS_BETWEENは、指定された日付date1からdate2までの月数を求める関数です(図13)。 SELECT MONTHS_BETW

奥畑 裕樹

2005年11月25日 20:00

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

図13:OracleでのMONTHS_BETWEEN関数の実行結果


   次のコードは、その結果を得るためのストアドファンクションです。

 



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のようなストアドプロシージャで対応します。ただし、与えるパラメータは日本語だけとは限りませんので各国に合わせた処理が必要になります。ここでは日本語だけに対応することとします。

PostgreSQLのNEXT_DAY関数の作成

リスト7:PostgreSQLのNEXT_DAY関数の作成
(画像をクリックすると別ウィンドウに拡大表示します)


   ストアドプロシージャを再定義する場合には、次のように一度ドロップする必要がありますので注意してください。
 

 

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)

 

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る