- 締切済み
PL/pgSQLにて日付変換ファンクションプロシージャー作成
ファンクションを用いて、Ver7.4.7のDBテーブルの更新日時の変換を、行いたいのですが? 値は、javaにてセットされた秒数を、yyyy-mm-ddの日付型へ変換したいのですが、可能でしょうか? 現在ググッて、検索していますが、探し出せておりません。 ご教授頂ければ、幸いです。宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Hardking
- ベストアンサー率45% (73/160)
javaでセットした秒数というのは、 javaのアプリ側でJDBC経由でDBテーブルの経過秒数 を保持する項目を更新したと意味です。 で、今回は基準日時と経過秒数で日時計算した結果を 戻り値として返す処理と再認識しました。 CREATE FUNCTION calcYmd(char) RETURNS DATE AS ' DECLARE wBasedt TIMESTAMP; wCalcdt TIMESTAMP; wInter VARCHAR; wdate VARCHAR; BEGIN --基準日時を編集する。 wBasedt := timestamp(date '1970-01-01', time '00:00:00-00'); -- 基準日時に経過秒数を加算する。 wInter := TO_CHAR(DBテーブルの経過秒数, '99999999'); wInter := wInter || ' second'; wCalcdt := wBasedt + interval wInter; wdate := TO_CHAR(wCalcdt, 'YYYYMMDD'); -- YYYY-MM-DD形式 -- 戻り値をDATE型にキャストする。 RETURN date wdate; END; ' LANGUAGE 'plpgsql';
- Hardking
- ベストアンサー率45% (73/160)
javaでセットされた秒数というのが意味不明ですが ファンクションプロシージャーのテキスト型入力パラメータ をデータ型がtimestampの項目に反映更新させる処理と 認識しました。 通常、DBテーブルのtimestamp型は入力パラメータとは関係なく now関数で最新に更新するのですが今回の場合は timestamp関数で日時更新します。 CREATE FUNCTION updatetime(char) RETURNS INTEGER AS ' DECLARE wSec VARCHAR(2); --秒数 wdate VARCHAR; wtime VARCHAR; utime VARCHAR; BEGIN -- 入力パラメータ(秒数)を取得 wSec := $1; -- 現在日付を取得 wdate := CURRENT_DATE; -- YYYY-MM-DD形式 -- 現在時間を取得 wtime := CURRENT_TIME; -- HH:MM:SS-SS形式 -- 現在時分と入力パラメータ(秒数)を文字連結する。 utime := SUBSTR(wtime,1,6) || wSec; UPDATE WK_TABLE SET AAA = timestamp(date wdate, time utime); END; ' LANGUAGE 'plpgsql';
補足
Hardkingさん、早々レスありがとうございます。 > javaでセットされた秒数というのが意味不明ですが 説明不十分で申し訳ないです。 私の設計ではないですが、当社DBテーブルの全ての日付の型は、date型では無くint型です。 1970/01/01 00:00:00 からの 経過秒数がセットされています。 関数を介してその秒数を、yyyy/mm/dd 型へ変換した値を、SQL抽出したデータ に付帯させたいのです。
お礼
色々試してみたのですが、残念ながら実行時エラーになりだめみたいです。 ex) CREATE OR REPLACE FUNCTION calcymd(int4) RETURNS SETOF "varchar" AS 'DECLARE indt ALIAS FOR $1; wBasedt TIMESTAMP; wCalcdt TIMESTAMP; wInter VARCHAR; wdate VARCHAR; BEGIN -- 基準日時を編集する。 wBasedt := TO_TIMESTAMP(''1970-01-01 00:00:00'', ''YYYY-MM-DD HH24:MI:SS''); -- 基準日時に経過秒数を加算する。 wInter := TO_CHAR(indt, ''99999999''); wInter := wInter || '' second''; wCalcdt := wBasedt + INTERVAL ''10 second''; ← リテラル表現しないと実行エラー -- YYYY-MM-DD形式 wdate := TO_CHAR(wCalcdt, ''YYYYMMDD''); RETURN wdate; END;' LANGUAGE 'plpgsql' VOLATILE; テーブルのフィールドの値が、date型なら interval で、時分秒の表現が使用出来るのでしょうね。 javaのクラスを作成して秒を日付に戻す事にします。 有難う御座いました。 また宜しくお願い致します。
補足
Hardkingさん、再度レス誠に恐縮です。 現在 pgAdmin3を介して、関数をコピベにて作成中ですが残念ながらエラーになりビルド出来ません。 勿論、(char)とDBテーブルの経過秒数は、引数セットに変更していますが、 他に何か注意する様な事がありますでしょうか?