[SQL] 밀리 초 단위로 오라클이 타임 스탬프의 차이를 계산
SQL밀리 초 단위로 오라클이 타임 스탬프의 차이를 계산
어떻게 오라클이 타임 스탬프 사이의 밀리 초 단위의 시간 차이를 계산합니까?
해결법
-
==============================
1.당신이 TIMESTAMP 유형의 두 변수를 뺄 때, 당신은 플랫폼에 따라 밀리 초 및 / 또는 마이크로의 숫자를 포함하는 INTERVAL DAY TO SECOND를 얻을. 데이터베이스가 Windows에서 실행중인 경우, SYSTIMESTAMP는 일반적으로 밀리 초해야합니다. 데이터베이스가 유닉스에서 실행중인 경우, SYSTIMESTAMP은 일반적으로 마이크로있을 것이다.
당신이 TIMESTAMP 유형의 두 변수를 뺄 때, 당신은 플랫폼에 따라 밀리 초 및 / 또는 마이크로의 숫자를 포함하는 INTERVAL DAY TO SECOND를 얻을. 데이터베이스가 Windows에서 실행중인 경우, SYSTIMESTAMP는 일반적으로 밀리 초해야합니다. 데이터베이스가 유닉스에서 실행중인 경우, SYSTIMESTAMP은 일반적으로 마이크로있을 것이다.
1 select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) 2* from dual SQL> / SYSTIMESTAMP-TO_TIMESTAMP('2012-07-23','YYYY-MM-DD') --------------------------------------------------------------------------- +000000000 14:51:04.339000000
당신은 INTERVAL DAY TO SECOND의 개별 요소를 추출하는 추출 기능을 사용할 수 있습니다
SQL> ed Wrote file afiedt.buf 1 select extract( day from diff ) days, 2 extract( hour from diff ) hours, 3 extract( minute from diff ) minutes, 4 extract( second from diff ) seconds 5 from (select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) diff 6* from dual) SQL> / DAYS HOURS MINUTES SECONDS ---------- ---------- ---------- ---------- 0 14 55 37.936
그런 다음 밀리 초에 해당 구성 요소 각각의 변환을 추가 할 수 있습니다
SQL> ed Wrote file afiedt.buf 1 select extract( day from diff )*24*60*60*1000 + 2 extract( hour from diff )*60*60*1000 + 3 extract( minute from diff )*60*1000 + 4 round(extract( second from diff )*1000) total_milliseconds 5 from (select systimestamp - to_timestamp( '2012-07-23', 'yyyy-mm-dd' ) diff 6* from dual) SQL> / TOTAL_MILLISECONDS ------------------ 53831842
보통은 그러나, 어느 INTERVAL DAY TO SECOND 표현을하거나 오히려 두 TIMESTAMP 값 (밀리 초)의 총 수를 계산하는 것보다 시간, 분, 초 등을위한 별도의 열이 더 유용하다.
-
==============================
2.여기에 그것을 할 수있는 저장된 프로 시저입니다 :
여기에 그것을 할 수있는 저장된 프로 시저입니다 :
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; /
투표를 당신은 또한 자신의 직업에 부정 오라클 개발자 밖으로 쓰레기를 이길 원한다면!
모든 사람에게 시간 정도 소요됩니다 처음으로 타임 스탬프를 비교하기 때문에 ...
-
==============================
3.
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;
-
==============================
4.
Select date1 - (date2 - 1) * 24 * 60 *60 * 1000 from Table;
-
==============================
5.나는이 철저하게 응답 한 것을 알고 있지만 나는 모두 내 기능을 공유하고 싶었다. 그것은 당신에게 당신이 당신의 대답은 일, 시간, 분, 초 또는 밀리 초 단위로 원하는 경우 선택할 수있는 옵션을 제공합니다. 당신은 당신의 요구에 맞게 수정할 수 있습니다.
나는이 철저하게 응답 한 것을 알고 있지만 나는 모두 내 기능을 공유하고 싶었다. 그것은 당신에게 당신이 당신의 대답은 일, 시간, 분, 초 또는 밀리 초 단위로 원하는 경우 선택할 수있는 옵션을 제공합니다. 당신은 당신의 요구에 맞게 수정할 수 있습니다.
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;
예를 들어, I 지금 (2018년 10월 12일 11 : 17 : 00.00)이 함수를 호출하는 경우 Return_Elapsed_Time (TO_TIMESTAMP ('12 .04.2017하여 12 : 00 : 00.00을 ','DD.MM.YYYY HH24 : MI : ss.ff 형식 ' ), SYSTIMESTAMP은), 그것은 무언가를 같이 반환해야합니다 :
47344620000 milliseconds
-
==============================
6.더 나은 그런 절차를 사용합니다 :
더 나은 그런 절차를 사용합니다 :
CREATE OR REPLACE FUNCTION timestamp_diff ( start_time_in TIMESTAMP , end_time_in TIMESTAMP ) RETURN NUMBER AS l_days NUMBER; l_hours NUMBER; l_minutes NUMBER; l_seconds NUMBER; l_milliseconds NUMBER; BEGIN SELECT extract(DAY FROM end_time_in-start_time_in) , extract(HOUR FROM end_time_in-start_time_in) , extract(MINUTE FROM end_time_in-start_time_in) , extract(SECOND FROM end_time_in-start_time_in) INTO l_days, l_hours, l_minutes, l_seconds FROM dual; l_milliseconds := l_seconds*1000 + l_minutes*60*1000 + l_hours*60*60*1000 + l_days*24*60*60*1000; RETURN l_milliseconds; END;
당신은 호출하여 확인할 수 있습니다 :
SELECT timestamp_diff (TO_TIMESTAMP('12.04.2017 12:00:00.00', 'DD.MM.YYYY HH24:MI:SS.FF'), TO_TIMESTAMP('12.04.2017 12:00:01.111', 'DD.MM.YYYY HH24:MI:SS.FF')) as milliseconds FROM DUAL;
-
==============================
7.포맷 간의 올바르게 주조 타임 스탬프는 다른 필드가 잘못 해석 될 수있는 기회가있다.
포맷 간의 올바르게 주조 타임 스탬프는 다른 필드가 잘못 해석 될 수있는 기회가있다.
여기에 두 개의 서로 다른 날짜 (DATE2, 날짜 1가) 테이블 TableXYZ에서 고려하는 경우 올바른 작업 예제입니다.
SELECT ROUND (totalSeconds / (24 * 60 * 60), 1) TotalTimeSpendIn_DAYS, ROUND (totalSeconds / (60 * 60), 0) TotalTimeSpendIn_HOURS, ROUND (totalSeconds / 60) TotalTimeSpendIn_MINUTES, ROUND (totalSeconds) TotalTimeSpendIn_SECONDS FROM (SELECT ROUND ( EXTRACT (DAY FROM timeDiff) * 24 * 60 * 60 + EXTRACT (HOUR FROM timeDiff) * 60 * 60 + EXTRACT (MINUTE FROM timeDiff) * 60 + EXTRACT (SECOND FROM timeDiff)) totalSeconds, FROM (SELECT TO_TIMESTAMP ( TO_CHAR (Date2, 'yyyy-mm-dd HH24:mi:ss') - 'yyyy-mm-dd HH24:mi:ss'), TO_TIMESTAMP ( TO_CHAR (Date1, 'yyyy-mm-dd HH24:mi:ss'), 'yyyy-mm-dd HH24:mi:ss') timeDiff FROM TableXYZ))
-
==============================
8.하나는 일부 구문 오류가 있습니다 위, 오라클에서 다음을 사용하십시오 :
하나는 일부 구문 오류가 있습니다 위, 오라클에서 다음을 사용하십시오 :
SELECT ROUND (totalSeconds / (24 * 60 * 60), 1) TotalTimeSpendIn_DAYS, ROUND (totalSeconds / (60 * 60), 0) TotalTimeSpendIn_HOURS, ROUND (totalSeconds / 60) TotalTimeSpendIn_MINUTES, ROUND (totalSeconds) TotalTimeSpendIn_SECONDS FROM (SELECT ROUND ( EXTRACT (DAY FROM timeDiff) * 24 * 60 * 60 + EXTRACT (HOUR FROM timeDiff) * 60 * 60 + EXTRACT (MINUTE FROM timeDiff) * 60 + EXTRACT (SECOND FROM timeDiff)) totalSeconds FROM (SELECT TO_TIMESTAMP(TO_CHAR( date2 , 'yyyy-mm-dd HH24:mi:ss'), 'yyyy-mm-dd HH24:mi:ss') - TO_TIMESTAMP(TO_CHAR(date1, 'yyyy-mm-dd HH24:mi:ss'),'yyyy-mm-dd HH24:mi:ss') timeDiff FROM TABLENAME ) );
-
==============================
9.두 타임 스탬프 열이 시도 사이의 초 단위 경과 시간을 계산해야하는 경우 I) :
두 타임 스탬프 열이 시도 사이의 초 단위 경과 시간을 계산해야하는 경우 I) :
SELECT extract ( day from (end_timestamp - start_timestamp) )*86400 + extract ( hour from (end_timestamp - start_timestamp) )*3600 + extract ( minute from (end_timestamp - start_timestamp) )*60 + extract ( second from (end_timestamp - start_timestamp) ) FROM table_name
II) U는 문자 형식으로 시간 차이가 이것을 시도 보여 싶다면 :
SELECT to_char (end_timestamp - start_timestamp) FROM table_name
from https://stackoverflow.com/questions/11617962/calculating-difference-between-two-timestamps-in-oracle-in-milliseconds by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 덮여 지수는 무엇입니까? (0) | 2020.04.01 |
---|---|
[SQL] (SQL 문) 마지막으로 삽입 된 행의 ID를 가져옵니다 [중복] (0) | 2020.04.01 |
[SQL] 행이 최대 날짜가 테이블에서 선택 정보 (0) | 2020.04.01 |
[SQL] 연속 행 사이의 날짜 차이 (0) | 2020.04.01 |
[SQL] 특정 순서로 여러 값 BY SQL ORDER? (0) | 2020.04.01 |