こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PL/pgSQLにて日付変換ファンクションプロシージャー作成

ファンクションを用いて、Ver7.4.7のDBテーブルの更新日時の変換を、行いたいのですが?
値は、javaにてセットされた秒数を、yyyy-mm-ddの日付型へ変換したいのですが、可能でしょうか?

現在ググッて、検索していますが、探し出せておりません。
ご教授頂ければ、幸いです。宜しくお願い致します。

投稿日時 - 2007-08-23 19:01:52

QNo.3280199

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

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';

投稿日時 - 2007-08-29 13:18:02

補足

Hardkingさん、再度レス誠に恐縮です。

現在 pgAdmin3を介して、関数をコピベにて作成中ですが残念ながらエラーになりビルド出来ません。
勿論、(char)とDBテーブルの経過秒数は、引数セットに変更していますが、
他に何か注意する様な事がありますでしょうか?

投稿日時 - 2007-08-30 13:27:40

お礼

色々試してみたのですが、残念ながら実行時エラーになりだめみたいです。
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のクラスを作成して秒を日付に戻す事にします。
有難う御座いました。
また宜しくお願い致します。

投稿日時 - 2007-09-01 12:41:14

ANo.1

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';

投稿日時 - 2007-08-28 10:34:18

補足

Hardkingさん、早々レスありがとうございます。

> javaでセットされた秒数というのが意味不明ですが
説明不十分で申し訳ないです。
私の設計ではないですが、当社DBテーブルの全ての日付の型は、date型では無くint型です。
1970/01/01 00:00:00 からの 経過秒数がセットされています。
関数を介してその秒数を、yyyy/mm/dd 型へ変換した値を、SQL抽出したデータ に付帯させたいのです。

投稿日時 - 2007-08-28 12:46:08

あなたにオススメの質問