Interval 값을 초로 변환

2024. 5. 6.·Oracle/SQL

Oracle은 Interval 값을 초로 변환할 때 아래와 같이 다소 복잡한 계산식을 사용해야 합니다.

-- 1
SELECT ts2 - ts1 AS int
     , EXTRACT (DAY    FROM ts2 - ts1) * 60 * 60 * 24
     + EXTRACT (HOUR   FROM ts2 - ts1) * 60 * 60
     + EXTRACT (MINUTE FROM ts2 - ts1) * 60
     + EXTRACT (SECOND FROM ts2 - ts1) AS sec
  FROM (SELECT TIMESTAMP '2050-01-01 00:00:00.000000000' AS ts1
             , TIMESTAMP '2050-02-01 00:00:00.123456789' AS ts2
          FROM DUAL);

INT                                         SEC
----------------------------- -----------------
+000000031 00:00:00.123456789 2678400.123456789

1 row selected.

 

Interval 값은 산술 연산을 지원하므로 아래의 계산식을 사용하면 비교적 간단한 방법으로 Interval 값을 초로 변환할 수 있습니다. 다만 계산값이 9자리(INTERVAL DAY(9))보다 크면 ORA-01873: the leading precision of the interval is too small 에러가 발생합니다.

-- 2-1
SELECT ts2 - ts1 AS int1
     , (ts2 - ts1) * 86400 AS int2
     , EXTRACT (DAY FROM (ts2 - ts1) * 24 * 60 * 60) AS sec
  FROM (SELECT TIMESTAMP '2050-01-01 00:00:00' AS ts1
             , TIMESTAMP '2081-09-09 01:46:39' AS ts2
          FROM DUAL);

INT1                          INT2                                SEC
----------------------------- ----------------------------- ---------
+000011574 01:46:39.000000000 +999999999 00:00:00.000000000 999999999

1 row selected.

-- 2-2
SELECT ts2 - ts1 AS int1
     , (ts2 - ts1) * 86400 * 1e3 AS int2
     , EXTRACT (DAY FROM (ts2 - ts1) * 24 * 60 * 60 * 1e3) / 1e3 AS sec
  FROM (SELECT TIMESTAMP '2050-01-01 00:00:00.000' AS ts1
             , TIMESTAMP '2050-01-12 06:54:15.134' AS ts2
          FROM DUAL);

INT1                          INT2                                 SEC
----------------------------- ----------------------------- ----------
+000000011 06:54:15.134000000 +975255134 00:00:00.000000000 975255.134

1 row selected.

-- 2-3
SELECT ts2 - ts1 AS int1
     , (ts2 - ts1) * 86400 * 1e6 AS int2
     , EXTRACT (DAY FROM (ts2 - ts1) * 24 * 60 * 60 * 1e6) / 1e6 AS sec
  FROM (SELECT TIMESTAMP '2050-01-01 00:00:00.000000' AS ts1
             , TIMESTAMP '2050-01-01 00:16:39.024855' AS ts2
          FROM DUAL);

INT1                          INT2                                 SEC
----------------------------- ----------------------------- ----------
+000000000 00:16:39.024855000 +999024855 00:00:00.000000000 999.024855

1 row selected.

-- 2-4
SELECT ts2 - ts1 AS int1
     , (ts2 - ts1) * 86400 * 1e6 AS int2
     , EXTRACT (DAY FROM (ts2 - ts1) * 24 * 60 * 60 * 1e6) / 1e6 AS sec
  FROM (SELECT TIMESTAMP '2050-01-01 00:00:00.000000' AS ts1
             , TIMESTAMP '2050-01-01 00:16:39.024856' AS ts2
          FROM DUAL);

ORA-01873: the leading precision of the interval is too small

 

참고

  • Stack Overflow - Extracting the total number of seconds from an interval data-type
저작자표시 비영리 변경금지 (새창열림)
'Oracle/SQL' 카테고리의 다른 글
  • SQL Macro - Scalar Expression
  • 분석 함수 기능 개선
  • 현재 세션 SERIAL 번호 조회
  • SYS_ROW_ETAG 함수
정희락
정희락
2007년부터 Oracle Database 성능 최적화에 관심을 가져왔습니다. 현재 한국오라클 Engineered Systems Solution Engineering 팀에서 Solution Engineer로 근무하고 있습니다. 이 블로그는 개인적인 연구 목적으로 운영되며 Oracle 사의 공식적인 입장을 대변하지 않습니다.
  • 정희락
    TunA
    정희락
  • 전체
    오늘
    어제
    • 분류 전체보기 (201)
      • Oracle (173)
        • SQL (33)
        • PLSQL (10)
        • Performance (74)
        • Administration (37)
        • Installation (3)
        • Utilities (1)
        • JSON (8)
        • Vector (7)
      • Exadata (15)
      • SQL*Plus (2)
      • Linux (5)
      • Resources (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 도서

    • 불친절한 SQL 프로그래밍
    • 불친절한 PL/SQL 프로그래밍
  • 링크

    • Connor McDonald
    • Frits Hoogland
    • Jonathan Lewis
    • Julian Dontcheff
    • Julian Dyke
    • Kun Sun
    • Maria Colgan
    • Martin Bach
    • Mike Dietrich
    • Tanel Poder
  • 공지사항

  • 인기 글

  • 태그

    12c
    19c
    21c
    23ai
    case study
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정희락
Interval 값을 초로 변환
상단으로

티스토리툴바