PLSQL CHARの項目を使用した計算

このQ&Aのポイント
  • Oracle8iのストアドプロシジャを作成しています。SELECT SYSDATEで取得したシステム時間から任意時間前の時刻を算出し、CHAR(16)の文字列(YYYYMMDDHHMMSSMS)にしたいのですが、うまくいきません。
  • SQLPLUSの標準出力にログを出して確認したところ、分や秒(W_CHECK_SS )がマイナスになってしまいます。どのようにすればうまくいくのかアドバイスをいただけたらと思います。
  • 現在は、システム時刻から基準前の時刻を計算していますが、その計算結果が正しくないようです。正しい計算結果を得るためにはどうすれば良いでしょうか?
回答を見る
  • ベストアンサー

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]という文字列を作成したいのです

  • Oracle
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
回答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;

sukekei
質問者

お礼

教えていただいた方法でできました。とてもシンプルなスクリプトになりました。 ありがとうございました。

その他の回答 (2)

回答No.2

単純に指定された秒後の日付を取得したいのであれば日付型で計算すればよいのではないのでしょうか? select sysdate+(60/(24*60*60)) nextdate from dual で60秒後の日付になるので後はTO_CHARで編集してあげれば良いと思います。 やりたいことと違っていたらごめんなさい。

sukekei
質問者

お礼

SQLで計算してあげれば簡単にできるのですね。 SQLをもっと勉強します。 ありがとうございます。

回答No.1

W_CHECK_MM := W_CHECK_SEC / 60; のところで、24.71... → 25 に四捨五入されてしまっているのではないでしょうか。

sukekei
質問者

お礼

確かに四捨五入されています。 だからマイナスになっていたのですね。 ご指摘ありがとうございます。

関連するQ&A

  • 時間の計算の方法

    2つのStr(time1、time2)に「yyyy/mm/dd hh:mm:ss」の形で データが入っていて、time2 - time1をtime3に「hh:mm:ss」に フォーマットして入れたいのですが、 VBの場合、  new1 = CDate(time1)  new2 = CDate(time2)  new3 = new2 - new1  time3 = Format(new3, "hh:mm:ss") で可能だと思いますが、ASPの場合はどのようにすればいいのですか? Formatを認識しないらしく、文字化けしてしまうので、 どなたか教えてください。よろしくお願いします。 まだASP歴、3日目なもので。。。。

  • MS-DOSでの日付表示

    MS-DOSコマンドで、日付や時刻の%date% %time%ですと、 yyyy/mm/dd hh:mm:ssの表示になります。 バッチファイルを作成して、フォルダ名の頭に日付時刻をつけたいんですが、 yyyymmdd hhmmss の表示形式にする方法が分かりません。 よろしかったら教えて頂けませんでしょうか。

  • 日付をVARCHAR2型でYYYYMMDDと表示したい

    DATE型(YYYY/MM/DD HH24:MI:SS)の値を取り出し、 VARCHAR2(8)型の文字列YYYYMMDDにしたいと思っています。 TO_CHAR(DATE型,'YYYYMMDD')としても、YY-MM-DDと表示されてしまいます。 YYYYMMDDと文字型で表示させるにはどうすればよいのでしょうか。 宜しくお願い致します。

  • SQL*Loader  フォーマット変換について

    SQL*Loaderの制御ファイル内で、 以下のような日付データを変換するにはどうしたらよいでしょうか? ・2010-12-06 00:00:00.000 以前は'2010-12-06 00:00:00'の形式だったので "to_char(to_date(:DENPYO_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYYMMDD')" のようにして変換が可能だったのですが、仕様変更がありましてこれに対応しなければいけなくなりました。 ちなみに安易な考えで以下のようにしたのですがさすがにだめでした... "to_char(to_date(:DENPYO_DATE,'YYYY-MM-DD HH24:MI:SS.000'),'YYYYMMDD')" 方法をご存知の方がいれば是非、ご教示いただきたく存じます。 よろしくお願いいたします。

  • タイムスタンプを時間に変換

    getTime()メソッドが返した値の、右の3つの数字を消すとタイムスタンプが得られました。1970年からの経過秒らしいです。 このタイムスタンプから yyyy/mm/dd hh:mm:ss のような年月日の表示にしたいのですが、簡単にできる方法はありませんか? i=1189382252 str="" //タイムスタンプを時間に変換 alert(str)

  • Access yyyymmddhhを取得する方法

    選択クエリで空のフィールドに、現在のシステム時刻から 今日の3時間後の日時データを取得したいです。 表題の通り、必要な日時データはyyyymmddhhの為、 以下の2つの方法を試したのですがhhが取り出せずにいます。 空のフィールド:DateAdd("h", 3, Now) →この場合、yyyy/mm/dd hh:nn:ss と表示されてしまいます。  分と秒、スラッシュやコロンは必要ないです。 空のフィールド:Format(Date(),"yyyymmdd") →この場合、yyyymmdd と表示され、当たり前ですが3時間後のhhが入りません。 勉強不足でお恥ずかしいのですが、どのように書いたら良いのか教えてください。 宜しくお願い致します。

  • String型とchar型の変換エラーです

    今晩は!またまたこの掲示板にきました。よろしくお願いします。 文字列かブランクを取り出すコードを書きましたが、 -------- char ch_check = str.charAt(i+1) ; if(ch_check ==" ") { --------- のところでString型とchar型の混合は受け入れられませんのようなエラーが出ました。 if(ch_check ==" "をboolean型でうけるのも拒否されました。 どこをどのようにしてやればよいでしょうか。 JAVA初心者です、特に文字列の取り扱いは評判通りわかり難くくないています。 よろしくお願いします。 ---------- public class Mojiretu_Blank { public static void main(String[] args) { String str = "This is a pen."; int i = 1 ; int blank_count = 0 ; while( i < (str.length()+1) ) { char ch_check = str.charAt(i+1) ; if(ch_check ==" ") { blank_count ++ ; System.out.println(ch_check); } else{} System.out.print("ブランクの数は" + blank_count + "個です。"); } } }

    • ベストアンサー
    • Java
  • Excel 時刻の計算方法

    Excel 時刻の計算方法 セルA 10/26/2010 06:54:32 セルB 10/27/2010 12:34:56 このような状態で、セルCにhh:mm:ss形式でAの時刻からBの時刻までにかかった時間を表示させたいのですが どうすればいいのでしょう

  • 日付関数について

    失礼します。 datファイルに、登録した日付を書き込む ストアドプロシージャを作成中です。 しかし、現在「to_char(sysdate,'YYYYMMDD hh24:mm:ssss')」 のように記述しテストをしてみると、 20070824 14:08:3737 20070824 14:08:4949 20070824 14:08:3030 のように出てしまい、ssssの特徴である"真夜中を過ぎた秒(0-86399)" が上手く出てくれません。(ssが2回連続で出てしまっているようです。。) 正確な記述方法を教えて頂けると助かります。 宜しくお願いいたします。

  • char型配列をString型にしたい

     VC++2005ExpressEdition + PlatformSDKを使用しています.  char型配列をString型にしたいと思っています(MessageBoxで表示するため).  int型ならば, > String^ out = String::Format("{0}", i ); > MessageBox::Show(out); などとできます.  下のアドレス(*1)のNo.2の答えにあるように > char ss[256]; > String^ out; > out=ss; とすると > error C2440: '=' : 'char [128]' から 'System::String ^' に変換できません。 なるエラーが出ます(S を大文字にしたりハットを付けたりしています).  char型の配列のString型への変換はどのようにすればいいのでしょうか. (*1)http://oshiete1.goo.ne.jp/kotaeru.php3?q=479640