日付に関するファンクション
日付に関するファンクション
日付に関する関数の移行も案外大変です。たとえばOracleには、月末を返すLAST_DAY()という関数があります。よく使う関数ですが、PostgreSQLにはありません。
この他にも、よく使う関数でPostgreSQLにはない関数がいくつかありますので自作して対応しなければなりません。
SYSDATE
OracleのSYSDATEは、PostgreSQLではcurrent_dateを使うことで移行できます。
ただし、デフォルトの出力フォーマットが違いますので、to_char()関数を使って出力フォーマットを揃える必要があります。
SELECT to_char(current_date,'YY-MM-DD') AS SYSDATE;
その出力結果は、次のようになります。
sysdate
----------
04-03-08
(1 row)ADD_MONTHS(date,add_number)
ADD_MONTHSは月の演算です。dateで指定された日付の月に、add_numberで指定された月を加算してくれる関数です。翌月を求めるときに便利な関数です。
SELECT ADD_MONTHS('2003/2/20',1) FROM DUAL;
その出力結果は次のようになります。
ADD_MONT
--------
03-03-20
この関数をPostgreSQLで実装する場合には、月をインターバル型でキャストし、それをパラメータに加算し結果を返すというストアドファンクションを作成します。
CREATE FUNCTION ADD_MONTHS(DATE,INT)
RETURNS DATE AS
'SELECT date($1 + interval($2 ||'' month''))'
LANGUAGE 'sql';
作成したADD_MONTHS関数を実行してみましょう(図12)
% SELECT ADD_MONTHS('2003/2/20',1);
add_months
------------
2003-03-20
(1 row) LAST_DAY(date)
LAST_DAYは、dateで指定されたパラメータの月末を求める関数です。
SELECT LAST_DAY('2003/2/20') FROM DUAL;
その実行結果は次のようになります。
LAST_DAY
--------
03-02-28
このような結果を得るために、PostgreSQLでは次のようなストアドファンクションを作成します。
CREATE FUNCTION LAST_DAY(DATE)
RETURNS DATE AS
'SELECT date(substr(text($1 +
interval(''1 month'')),1,7)||''-01'')-1'
LANGUAGE 'sql';
その実行結果は次のようになります。
SELECT LAST_DAY('2003/2/20');
last_day
------------
2003-02-28
(1 row)