PLSQL CHARの項目を使用した計算
Oracle8iのストアドプロシジャを作成しています。
SELECT SYSDATE で取得したシステム時間から任意時間前の時刻を算出し、CHAR(16)の文字列(YYYYMMDDHHMMSSMS)にしたいのですが、
うまくいきません。
次のようなやり方をしています。
(1)システム時刻を取得し、CHAR型変数へ格納。
(2)時、分、秒ごとにCHAR型の変数へセット。
(3)TO_NUMBER関数でNUMBER型へ変換して、NUMBER型変数に格納。
(4)任意時間前の時刻の算出。
SQLPLUSの標準出力にログを出して確認したところ、分や秒(W_CHECK_SS )がマイナスになってしまいます。
どのようにすればうまくいくのかアドバイスをいただけたらと思います。
今は以下のように書いています。
CREATE OR REPLACE PROCEDURE TESTSP (
IN_KIJUN_TIME IN NUMBER --監視基準時間(秒)
)
IS
W_CURRENT_TIME16 CHAR(16); --システム時刻(16桁)
W_CURRENT_TIME14 CHAR(14); --システム時刻(14桁)
W_CURRENT_YYYYMMDD CHAR(8); --システム時刻(YYYYMMDD)
W_CURRENT_HH NUMBER(2); --システム時刻(HH)
W_CURRENT_MM NUMBER(2); --システム時刻(MM)
W_CURRENT_SS NUMBER(2); --システム時刻(SS)
W_CURRENT_HH_STR CHAR(2); --システム時刻(HH)CHAR型
W_CURRENT_MM_STR CHAR(2); --システム時刻(MM)CHAR型
W_CURRENT_SS_STR CHAR(2); --システム時刻(SS)CHAR型
W_CHECK_SEC NUMBER(5); --基準前時刻(計算用)
W_CHECK_HH NUMBER(2); --基準前時刻(HH)
W_CHECK_MM NUMBER(2); --基準前時刻(MM)
W_CHECK_SS NUMBER(2); --基準前時刻(SS)
W_CHECK_HMS CHAR(16); --基準前時刻(16桁)
BEGIN
/*-- システム時刻の取得 --*/
SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') INTO W_CURRENT_TIME14 FROM DUAL;
-- ◆DEBUG START
DBMS_OUTPUT.PUT_LINE('・システム時刻14 = ' || W_CURRENT_TIME14);
-- ◆DEBUG END
/*-- 基準前時刻の計算 --*/
W_CURRENT_YYYYMMDD := SUBSTR(W_CURRENT_TIME14,1,8);
W_CURRENT_HH_STR := SUBSTR(W_CURRENT_TIME14,9,2);
W_CURRENT_MM_STR := SUBSTR(W_CURRENT_TIME14,11,2);
W_CURRENT_SS_STR := SUBSTR(W_CURRENT_TIME14,13,2);
W_CURRENT_HH := TO_NUMBER(W_CURRENT_HH_STR);
W_CURRENT_MM := TO_NUMBER(W_CURRENT_MM_STR);
W_CURRENT_SS := TO_NUMBER(W_CURRENT_SS_STR);
--
W_CHECK_SEC := W_CURRENT_HH * 3600
+ W_CURRENT_MM * 60
+ W_CURRENT_SS
- IN_KIJUN_TIME;
W_CHECK_HH := W_CHECK_SEC / 3600;
W_CHECK_SEC := W_CHECK_SEC - (W_CHECK_HH * 3600);
W_CHECK_MM := W_CHECK_SEC / 60;
W_CHECK_SS := W_CHECK_SEC - (W_CHECK_MM * 60);
W_CHECK_HMS := W_CURRENT_YYYYMMDD || W_CHECK_HH || W_CHECK_MM || W_CHECK_SS || '00';
-- ◆DEBUG START
DBMS_OUTPUT.PUT_LINE('・W_CHECK_HH = ' || W_CHECK_HH);
DBMS_OUTPUT.PUT_LINE('・W_CHECK_MM = ' || W_CHECK_MM);
DBMS_OUTPUT.PUT_LINE('・W_CHECK_SS = ' || W_CHECK_SS);
-- ◆DEBUG END
(以下省略)
【標準出力】
SQL> EXEC TESTSP(60);
・引数:監視基準時間(秒) = 60
・システム時刻14 = 20070308222543
・システム時刻(YYYYMMDD) = 20070308
・W_CHECK_HH = 22
・W_CHECK_MM = 25
・W_CHECK_SS = -17
※システム時刻[22:25:43]の60秒前は22:24:43なので、
[2007030822244300]という文字列を作成したいのです
お礼
これってシステムなのですか・・ビックリです。ただ画像掲示板の場合普通の掲示板と違って、ファイルを選択するのに時間がかかったりするので、更新のタイミング・内容の確認・考える・書く・画を選ぶ・送る・なんてことを約1分以内できるのはすごいなーと思いました。 若い人はみなこんなに早いのですかねぇ?(あんまり若くないもので・・(^_^;))ありがとうございました。(これ書くのにも3分かかってしまった)
補足
(補足質問ではありませんが・・) 短時間に集中するのはわかりますが、そうなると別ページのNo.19とNo.20の間が丸一日あいてるのが説明がつかないような・・。