• 締切済み

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

ファンクションを用いて、Ver7.4.7のDBテーブルの更新日時の変換を、行いたいのですが? 値は、javaにてセットされた秒数を、yyyy-mm-ddの日付型へ変換したいのですが、可能でしょうか? 現在ググッて、検索していますが、探し出せておりません。 ご教授頂ければ、幸いです。宜しくお願い致します。

みんなの回答

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.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';

JACK_TOSHI
質問者

お礼

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

JACK_TOSHI
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。
  • Hardking
  • ベストアンサー率45% (73/160)
回答No.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';

JACK_TOSHI
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 日付のフォーマット変換について

    はじめまして。 日付フォーマット変換について質問です。 「Tue Sep 16 04:06:38 JST 2003」 上記のようなStringの値を yyyy/mm/dd hh:mm:ssのように 変換したいのですが、どのような方法を とれば良いのかわからず困っております。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • Excel VBA で日付を4ケタの数値に変換させるには?

    ある日付データを 『月』と『日付』のみの4ケタの"文字列"にさせて表示処理させたいのですが、困っております。 現在、VBAを使用しないで処理させると…こんな感じで困っています。 1.日付を yyyy/mm/dd 表示 2.編集~ 『/』のみを全て『0』に変換 3.RIGHT関数で4ケタ(または5ケタ)抜き取る *データ* 日付    yyyy/mm/dd  変換      RIGHT(4ケタ) 1月5日  2005/1/5     20050105   0105 1月10日  2005/1/10    200501010   0110  ・    ・  ・    ・ ▲不具合状況 1."1月10日" のように日付が2ケタになる日は "1010" のように表示がずれる。RIGHT(○,5) で対処する方法もあるが…効率があまり良くない。 2."yyyy/mm/dd" のデータを直で "RIGHT( )" で処理させると思ったとおりの値が戻ってこない。 yyyy/mm/dd      RIGHT() 2005/1/5    →   8537 …変な値が戻ってくる? VBAで一気にやる方法ありますでしょうか? お知恵を拝借ください!

  • 14桁の日付(YYYYMMDDHHMMSS)を日付(YYYY/MM/DD)に変換できますか?

    データとして14桁の値で日付が登録されています。 この14桁の値(YYYYMMDDHHMMSS)を日付(YYYY/MM/DD)に変換できますか? やりたい事はこの14桁の値から現在の日付から過去1年以内のデータを取得したいと思っていますが・・・ どのようにしたらいいのでしょうか? 申し訳ありません、アドバイスいただけませんでしょうか? 宜しくお願いします。

  • 日付形式の変換

    はじめまして Perlで日付形式の変換をしたいと思っています。 RFC1123形式(2 Mar 2006 04:28:25 -0800)から yyyy/mm/dd hh:mm:ssの形式に変換したいのです。 色々と調べましたが、適当なヒントがあるところがありません でした。 どうぞ、関連サイトでも構いませんので、ご回答お願いいたします。

    • ベストアンサー
    • Perl
  • 日付への変換

    最近javaを始めて、javaでホームページの最終更新時間のチェックプログラムを作ってみたくて、Swingを使ってチマチマ試しているのですが (1):URLクラスでgetLastModified()を使ってホームページから取得した値をdate型に変換 (2):tableに入れておいた日付データをStringで取り出してdate型に変換 (3):(1)と(2)を比較して大きい方をtableに戻す という感じのを考えてプログラムを作っていたところ、(1)で詰まってしまいました。 何かいい方法はないでしょうか?

    • ベストアンサー
    • Java
  • 日付を米国式から日本式に変換出来ますか?

    日付データが、12-05-2007 と年度が最後にくるアメリカ形式で保存されている場合これを簡単に 2007-12-05 と変換する方法はありますか? mm-dd-yyyy → yyyy-mm-dd 日付は日本、アメリカ、ヨーロッパなどでいろんな表示形式があるようです。 エクセルでもセルの設定で変換するようですね。 もしご存知の方がいましたら教えてください。

    • 締切済み
    • PHP
  • クリスタルレポートの式フィールドで日付変換。

    クリスタルレポート8の式フィールドで日付を表示させようと思っています。 標準では『YYYY/MM/DD』形式なのですがこれを『YYYY-MM-DD』で表示させたいのですがうまくいきません。 式フィールドには if A ="1" then formula = CurrentDate と記述しています。 Aの値が"1"ならば日付を表示です。 説明が下手で分かりづらいかもしれませんが、 補足しますのでヨロシクお願いします。

  • C#による日付のフォーマット変換について

    初めまして。 大学にてC#を勉強中の身なのですが、文字列の日付フォーマット 【YYYY/MM/DD → DD-MMM-YY】 への変換方法が分からず困っています。 よろしければどなたかご教授して頂けないでしょうか? ※このような形に変換を希望しています string型 【2000/01/01】 → string型 【01-Jan-00】

  • Excelの日付の表示形式の変換方法について

    次のExcelの日付の表示形式の変換方法について、お分かりになる方がいれば是非教えてください。 通常の表示形式(「yyyy/mm/dd」など)を、「yyyy-mm-ddT00:00:00Z」に変換するにはどのような方法があるでしょうか? ネットで検索しても分からず、もしご教授頂ければ幸いです。 どうぞ宜しくお願いいたします。

  • ALTER SESSIONについて

    オラクルのDBに対してあるSQLスクリプトを実行しなければならないのですが、その冒頭に、 alter session set nls_date_format = 'yyyy/mm/dd'; とあり、このコマンドの意味を教えてもらいたいのです。ちなみにスクリプトは、あるテーブルの一行だけを変更するUPDATE文です。末尾にはCOMMIT; があります。 alter session.... は、何らかの日付データを2005/12/05のような形に変更することを意味しているようですが、<何>を設定しているのかが分かりません。 また、このnls_date_formatの値は、DBのどこを検索すれば分かるのでしょうか。スクリプトを流す前の値が'yyyy/mm/dd'ではない場合、スクリプトを流すことで、DBの設定が変わってしまうのでしょうか。 DB初心者です。まとまりのない文章ですみませんがよろしくお願いします。