
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_TIMEINNUMBER--監視基準時間(秒)
)
IS
W_CURRENT_TIME16CHAR(16);--システム時刻(16桁)
W_CURRENT_TIME14CHAR(14);--システム時刻(14桁)
W_CURRENT_YYYYMMDDCHAR(8);--システム時刻(YYYYMMDD)
W_CURRENT_HHNUMBER(2);--システム時刻(HH)
W_CURRENT_MMNUMBER(2);--システム時刻(MM)
W_CURRENT_SSNUMBER(2);--システム時刻(SS)
W_CURRENT_HH_STRCHAR(2);--システム時刻(HH)CHAR型
W_CURRENT_MM_STRCHAR(2);--システム時刻(MM)CHAR型
W_CURRENT_SS_STRCHAR(2);--システム時刻(SS)CHAR型
W_CHECK_SECNUMBER(5);--基準前時刻(計算用)
W_CHECK_HHNUMBER(2);--基準前時刻(HH)
W_CHECK_MMNUMBER(2);--基準前時刻(MM)
W_CHECK_SSNUMBER(2);--基準前時刻(SS)
W_CHECK_HMSCHAR(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]という文字列を作成したいのです
No.3ベストアンサー
- 回答日時:
#2です。
こんな感じでどうでしょう?
create or replace procedure testsp(in_kijun_time in number)
is
wkday_dt date;
wk_day_c varchar2(20);
day_hh char(2);
day_mi char(2);
day_ss char(2);
begin
wkday_dt := sysdate;
dbms_output.put_line('現在時刻:'||to_char(wkday_dt,'yyyymmddhh24miss')||'00');
wkday_dt := wkday_dt+(in_kijun_time/(24*60*60));
dbms_output.put_line('算出時刻:'||to_char(wkday_dt,'yyyymmddhh24miss')||'00');
-- パーツ単位で取得したいのなら
day_hh := to_char(wkday_dt,'hh');
day_mi := to_char(wkday_dt,'mi');
day_ss := to_char(wkday_dt,'ss');
dbms_output.put_line('時:'||day_hh);
dbms_output.put_line('分:'||day_mi);
dbms_output.put_line('秒:'||day_ss);
end;
No.2
- 回答日時:
単純に指定された秒後の日付を取得したいのであれば日付型で計算すればよいのではないのでしょうか?
select sysdate+(60/(24*60*60)) nextdate from dual
で60秒後の日付になるので後はTO_CHARで編集してあげれば良いと思います。
やりたいことと違っていたらごめんなさい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- 電気・ガス・水道業 三相電動誘導機全閉外扇型や、耐圧防爆型のテストリポート一台毎に付けてますが何故か英文、 1 2022/03/27 00:10
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- 英語 From the data mentioned that extracted from the cu 1 2023/01/25 19:55
- 英語 TOEICの問題の解答と解説を教えてください。 3 2023/01/19 23:12
- 英語 BIG CITY LIFE Look at the title of the text. Use a 2 2022/05/17 22:07
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- JavaScript 正規表現について質問です。条件に合う場合はtrueを返したい 3 2022/10/06 23:02
- その他(パソコン・スマホ・電化製品) USB充電の規格の正式名称は何でしょうか? 3 2023/08/26 09:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
重複するIDのデータを1行にま...
-
OSのシステム日付を変更して...
-
今日の日付が入った行のデータ...
-
SQLで部分的にGROUP BYしたいとき
-
LogParserを使用した前日分のイ...
-
指定した年月までのデータを取...
-
excelマクロで意図通りのソート...
-
SELECT結果の縦と横の入れ替え
-
先期末の日付を求めるSQL
-
DATE型の省略値について
-
テーブルの主キーをdate型...
-
OSのシステム日付を変更して...
-
ExcelのSUMPRODUCTで日付の範囲...
-
日付の最大値レコードを取得す...
-
WHERE句にて「30日前から今日ま...
-
一秒ごとに更新をかける方法
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
SQLサーバで和暦から西暦に変換...
-
エクセル 日付による並べ替え...
-
wordの差し込み印刷での日付表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
今日の日付が入った行のデータ...
-
SQLで部分的にGROUP BYしたいとき
-
Accessの数値から時間に変換す...
-
重複するIDのデータを1行にま...
-
SQLサーバで和暦から西暦に変換...
-
日付書式に変換でこまっています!
-
テーブルの主キーをdate型...
-
日数算出SQL
-
wordの差し込み印刷での日付表示
-
oracle 文字列 01:45 を時間に...
-
日付の切り出し方法について
-
Excelグラフの日付軸の日付がず...
-
WHERE句にて「30日前から今日ま...
-
SQL/Loaderでの年月日時分秒の...
-
エクセル 日付による並べ替え...
-
excel 日付のみ置換したいのです
-
DB2のSQL(日付)について
-
指定した年月までのデータを取...
-
日付の最大値レコードを取得す...
おすすめ情報