TIMESTAMP型の2つの変数を引くと、プラットフォームに応じてミリ秒やマイクロ秒の数を含むINTERVAL DAY TO SECONDが得られます。 データベースがWindows上で動作している場合、systimestampには通常ミリ秒が入ります。 データベースがUnix上で動作している場合、systimestamp`には一般的にマイクロ秒が入ります。
CREATE OR REPLACE function timestamp_diff(a timestamp, b timestamp) return number is
begin
return extract (day from (a-b))*24*60*60 +
extract (hour from (a-b))*60*60+
extract (minute from (a-b))*60+
extract (second from (a-b));
end;
/
SELECT numtodsinterval(date1-date2,'day') time_difference from dates;
タイムスタンプの場合
SELECT (extract(DAY FROM time2-time1)*24*60*60)+
(extract(HOUR FROM time2-time1)*60*60)+
(extract(MINUTE FROM time2-time1)*60)+
extract(SECOND FROM time2-time1)
into diff FROM dual;
RETURN diff;
CREATE OR REPLACE FUNCTION Return_Elapsed_Time (start_ IN TIMESTAMP, end_ IN TIMESTAMP DEFAULT SYSTIMESTAMP, syntax_ IN NUMBER DEFAULT NULL) RETURN VARCHAR2 IS
FUNCTION Core (start_ IN TIMESTAMP, end_ IN TIMESTAMP DEFAULT SYSTIMESTAMP, syntax_ IN NUMBER DEFAULT NULL) RETURN VARCHAR2 IS
day_ VARCHAR2(7); /* This means this FUNCTION only supports up to 99 days */
hour_ VARCHAR2(9); /* This means this FUNCTION only supports up to 999 hours, which is over 41 days */
minute_ VARCHAR2(12); /* This means this FUNCTION only supports up to 9999 minutes, which is over 17 days */
second_ VARCHAR2(18); /* This means this FUNCTION only supports up to 999999 seconds, which is over 11 days */
msecond_ VARCHAR2(22); /* This means this FUNCTION only supports up to 999999999 milliseconds, which is over 11 days */
d1_ NUMBER;
h1_ NUMBER;
m1_ NUMBER;
s1_ NUMBER;
ms_ NUMBER;
/* If you choose 1, you only get seconds. If you choose 2, you get minutes and seconds etc. */
precision_ NUMBER; /* 0 => milliseconds; 1 => seconds; 2 => minutes; 3 => hours; 4 => days */
format_ VARCHAR2(2) := ', ';
return_ VARCHAR2(50);
BEGIN
IF (syntax_ IS NULL) THEN
precision_ := 0;
ELSE
IF (syntax_ = 0) THEN
precision_ := 0;
ELSIF (syntax_ = 1) THEN
precision_ := 1;
ELSIF (syntax_ = 2) THEN
precision_ := 2;
ELSIF (syntax_ = 3) THEN
precision_ := 3;
ELSIF (syntax_ = 4) THEN
precision_ := 4;
ELSE
precision_ := 0;
END IF;
END IF;
SELECT EXTRACT(DAY FROM (end_ - start_)) INTO d1_ FROM DUAL;
SELECT EXTRACT(HOUR FROM (end_ - start_)) INTO h1_ FROM DUAL;
SELECT EXTRACT(MINUTE FROM (end_ - start_)) INTO m1_ FROM DUAL;
SELECT EXTRACT(SECOND FROM (end_ - start_)) INTO s1_ FROM DUAL;
IF (precision_ = 4) THEN
IF (d1_ = 1) THEN
day_ := ' day';
ELSE
day_ := ' days';
END IF;
IF (h1_ = 1) THEN
hour_ := ' hour';
ELSE
hour_ := ' hours';
END IF;
IF (m1_ = 1) THEN
minute_ := ' minute';
ELSE
minute_ := ' minutes';
END IF;
IF (s1_ = 1) THEN
second_ := ' second';
ELSE
second_ := ' seconds';
END IF;
return_ := d1_ || day_ || format_ || h1_ || hour_ || format_ || m1_ || minute_ || format_ || s1_ || second_;
RETURN return_;
ELSIF (precision_ = 3) THEN
h1_ := (d1_ * 24) + h1_;
IF (h1_ = 1) THEN
hour_ := ' hour';
ELSE
hour_ := ' hours';
END IF;
IF (m1_ = 1) THEN
minute_ := ' minute';
ELSE
minute_ := ' minutes';
END IF;
IF (s1_ = 1) THEN
second_ := ' second';
ELSE
second_ := ' seconds';
END IF;
return_ := h1_ || hour_ || format_ || m1_ || minute_ || format_ || s1_ || second_;
RETURN return_;
ELSIF (precision_ = 2) THEN
m1_ := (((d1_ * 24) + h1_) * 60) + m1_;
IF (m1_ = 1) THEN
minute_ := ' minute';
ELSE
minute_ := ' minutes';
END IF;
IF (s1_ = 1) THEN
second_ := ' second';
ELSE
second_ := ' seconds';
END IF;
return_ := m1_ || minute_ || format_ || s1_ || second_;
RETURN return_;
ELSIF (precision_ = 1) THEN
s1_ := (((((d1_ * 24) + h1_) * 60) + m1_) * 60) + s1_;
IF (s1_ = 1) THEN
second_ := ' second';
ELSE
second_ := ' seconds';
END IF;
return_ := s1_ || second_;
RETURN return_;
ELSE
ms_ := ((((((d1_ * 24) + h1_) * 60) + m1_) * 60) + s1_) * 1000;
IF (ms_ = 1) THEN
msecond_ := ' millisecond';
ELSE
msecond_ := ' milliseconds';
END IF;
return_ := ms_ || msecond_;
RETURN return_;
END IF;
END Core;
BEGIN
RETURN(Core(start_, end_, syntax_));
END Return_Elapsed_Time;
TIMESTAMP
型の2つの変数を引くと、プラットフォームに応じてミリ秒やマイクロ秒の数を含む
INTERVAL DAY TO SECONDが得られます。 データベースがWindows上で動作している場合、
systimestampには通常ミリ秒が入ります。 データベースがUnix上で動作している場合、
systimestamp`には一般的にマイクロ秒が入ります。EXTRACT
関数を使用すると、
INTERVAL DAY TO SECOND`の個々の要素を抽出することができます。そして、それらの各要素をミリ秒に変換し、それらを加算することができます。
しかし通常は、2つの
TIMESTAMP
値の間のミリ秒数の合計を計算するよりも、INTERVAL DAY TO SECOND
表現か、時間、分、秒などの個別の列を持つほうが便利です。これを行うための保存されたprocは次のとおりです。
彼の仕事に否定したOracle開発者のがらくたを打ち負かしたいのであれば、賛成投票してください。!
タイムスタンプを初めて比較するため、全員に1時間ほどかかるはずです。..
もっと簡単な解決策
タイムスタンプの場合
私はこれが徹底的に答えられたことを知っていますが、私の機能をみんなと共有したかったのです。 答えを日、時間、分、秒、ミリ秒のいずれにするかを選択するオプションがあります。 ニーズに合わせて変更できます。
たとえば、今すぐこの関数(12.10.2018 11:17:00.00)にReturn_Elapsed_Time(TO_TIMESTAMP( '12.04.2017 12:00:00.00'、 'DD.MM.YYYY HH24:MI:SS.FF ')、SY
そのような手順を使用する方が良いです:
:を呼び出して確認できます。
上記には構文エラーがあります。oracleでは以下を使用してください。
I)2つのタイムスタンプ列の間の経過時間を秒単位で計算する必要がある場合は、次のように試してください。
II)文字形式の時差を表示したい場合は、次のようにしてください。
タイムスタンプは他のフォーマット間で正しくキャストされ、フィールドが誤って解釈される可能性があります。
以下は、表TableXYZから2つの異なる日付(Date2、Date1)を考慮した場合に正しい作業サンプルです。