2017-06-25 8 views
0

私はのOracle日時差の問題は/ PM

create or replace procedure ModAuditData(
O_UpdatedCount out int 
,O_EndTime out timestamp 
,O_Duration out int) 
as 


    P_StartTime timestamp(3) WITH LOCAL TIME ZONE; 
    -- EndTime timestamp; 

    begin 
    P_StartTime:=to_timestamp(to_char(current_timestamp,'DD/MM/YYYY HH:MI:SS'),'DD/MM/YYYY HH:MI:SS'); 
    -- merge Statment that does UPSERT 
    O_UpdatedCount :=SQL%ROWCOUNT; 
    commit; 

    O_EndTime:=to_timestamp(to_char(current_timestamp,'DD/MM/YYYY HH:MI:SS'),'DD/MM/YYYY HH:MI:SS'); 
    begin 
     select extract(second from (O_EndTime-P_StartTime)) 
     into O_Duration 
     from dual; 
      Exception When others then 
     O_Duration:=0; 
    end; 

    end ModAuditData; 

問題は

O_EndTime:=to_timestamp(to_char(current_timestamp,'DD/MM/YYYY HH:MI:SS'),'DD/MM/YYYY HH:MI:SS') 

の正反対を与えるMERGE文にかかる時間を計算し、次のストアドプロシージャでいます
P_StartTime:=to_timestamp(to_char(current_timestamp,'DD/MM/YYYY HH:MI:SS'),'DD/MM/YYYY HH:MI:SS'); 

AM/PMに換算して

+0

タイムスタンプをcharに変換し、再びタイムスタンプに変換することの意義は何ですか? – Utsav

答えて

1

CURRENT_TIMESTAMPが既にTIMESTAMP WITH TIME ZONEで開始時間と終了時間を計算するための正しい方法は何ですか、TIMESTAMPに戻し、再び最初のVARCHAR2にし、それを変換する理由はありません。

timestamp(3)(精度はミリ秒まで)は、durationをINTEGER、つまりフル秒で返すと意味をなさない。 * SQLの場合

P_StartTime timestamp(3) WITH TIME ZONE; 

    begin 
    P_StartTime := current_timestamp; 
    -- merge Statment that does UPSERT 
    O_UpdatedCount :=SQL%ROWCOUNT; 
    commit; 

    O_Duration := EXTRACT(SECOND FROM (current_timestamp - P_StartTime)); 
    end; 

プラスTIMINGコマンドを使用することを検討してください。

はこのようにそれを試してみてください。

+0

お時間をいただきありがとうございます – ronan