복붙노트

[SQL] 밀리 초 단위로 오라클이 타임 스탬프의 차이를 계산

SQL

밀리 초 단위로 오라클이 타임 스탬프의 차이를 계산

어떻게 오라클이 타임 스탬프 사이의 밀리 초 단위의 시간 차이를 계산합니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.

    Select date1 - (date2 - 1) * 24 * 60 *60 * 1000 from Table;
    
  5. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    
  10. from https://stackoverflow.com/questions/11617962/calculating-difference-between-two-timestamps-in-oracle-in-milliseconds by cc-by-sa and MIT license