programing

Oracle SQL: 타임스탬프를 UTC로 변환

telecom 2023. 6. 29. 19:46
반응형

Oracle SQL: 타임스탬프를 UTC로 변환

아래와 같은 간단한 선택 질문이 있지만 지역별 시간을 다시 확인하고 있습니다.선택 문에서 UTC로 변환하려면 어떻게 해야 합니까?

select myTimeStamp, MyName, MyBranch from tableA

결과: '27/03/2014 15:15:26' '존', '런던'

sys_extract_utc(myTimeStamp)를 사용해 보았지만 오류가 발생했습니다.

sql 명령이 제대로 종료되지 않았습니다.

myTimestamp'날짜' 유형입니다.

select cast(mytimestamp as timestamp) at time zone 'UTC', 
       MyName, 
       MyBranch 
from tableA

왜냐면mytimestamp사실은date캐스팅에 필요한 타임스탬프가 아닙니다.이렇게 하면 Oracle은 다음에 저장된 정보를mytimestamp서버의 시간대에 있습니다. 그렇지 않으면 Madhawas의 솔루션을 사용해야 합니다.

유형에 따라 데이터 유형에 따라 Oracle이 변환하는 시간대와 관련하여 몇 가지 Gotchas가 있습니다.myTimestamp사실은.

시간대가 있는 타임스탬프

바로 작동합니다™.여기에 _no_name이 있는 _horse_가 정답입니다.

로컬 표준시가 포함된 타임스탬프

시간대를 사용하여 암묵적으로 타임스탬프를 생성한 다음 It Just Works™를 생성합니다.다시 말씀드리지만_no_name을 가진_horse_가 바로 여기에 있습니다.

타임스탬프

시간대로 타임스탬프를 지정하기 위해 암묵적으로 캐스트되지만 기본적으로 할당되는 시간대는 세션 시간대입니다(데이터베이스 시간대와는 반대).

  • 이것의 명시적인 호출은.myTimestamp at local.
  • 또는 매드하와스의 말대로 할 수 있고 (그리고 더 나을 가능성이 높습니다)from_tz세션의 시간대가 아닌 명시적인 시간대로 값을 명시적으로 작성하는 함수입니다.

날짜.

설명한 대로 지금까지 의 작업 중 하나를 수행하려고 하면 실패합니다.

  • myTimestamp at time zone 'UTC'
    ORA-30084: 표준 시간 수정자가 있는 날짜/시간 기본 데이터 유형이 잘못되었습니다.

  • from_tz(myTimestamp, 'America/New_York')
    ORA-00932: 일관성 없는 데이터 유형: 예상되는 TIMESTAMP가 날짜를 받았습니다.

여기서 해결책은 먼저 날짜를 타임스탬프로 캐스트하는 것입니다.

select from_tz(cast(myTimestamp as timestamp), 'America/New_York') from tableA

샘플 스크립트

다음 스크립트는 동작을 보여줍니다.내 시스템에서는dbtimezone미국/중부 및sessiontimezoneGMT-05:00입니다.

사용하기도 합니다.to_char일부 도구가 타임스탬프를 제대로 지원하지 않는 경우(요즘은 드물지만 여전히 문제가 될 수 있음) 출력을 변환하는 데 미묘한 방법으로 결과 타임스탬프를 변경할 수 있습니다.

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'
/
alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS'
/
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS TZR'
/

select dbtimezone
      ,sessiontimezone
      ,to_char(timestamp '2017-01-01 06:00:00') as ts
      ,to_char(timestamp '2017-01-01 06:00:00' at local) as ts_at_local
      ,to_char(timestamp '2017-01-01 06:00:00' at time zone dbtimezone) as ts_at_db
      ,to_char(timestamp '2017-01-01 06:00:00' at time zone sessiontimezone) as ts_at_session
 from dual
/

내 시스템의 출력은 다음과 같습니다(가독성을 위해 기둥 모양으로 다시 포맷됨).

DBTIMEZONE          US/Central
SESSIONTIMEZONE     -05:00
TS                  2017-01-01 06:00:00
TS_AT_LOCAL         2017-01-01 06:00:00 -05:00
TS_AT_DB            2017-01-01 05:00:00 US/CENTRAL
TS_AT_SESSION       2017-01-01 06:00:00 -05:00

이를 위한 시간대를 알아야 합니다.

SELECT myTimeStamp, from_tz(myTimeStamp, 'America/New_York') AT TIME ZONE 'UTC' utc FROM dual;

Oracle 19c부터 새로운 기능이 도입되었습니다.

SQL 함수 TO_UTC_TIMESTAMP_TZ는 ISO 8601 날짜 형식 문자열을 varchar 입력으로 사용하고 TIMEZONE이 포함된 SQL 데이터 유형의 인스턴스를 반환합니다.입력을 UTC 시간(조정된 표준시, 이전의 그리니치 표준시)으로 정규화합니다.SQL 함수 TO_TIMESTAMP_TZ와 달리 새 함수는 입력 문자열이 ISO 8601 날짜 형식을 사용하여 표준 시간대를 UTC 0으로 기본 설정한다고 가정합니다.

select TO_UTC_TIMESTAMP_TZ ( to_char(sysdate,'yyyy-mm-dd"T"HH:MI:SS') )  as utc 
   from dual;

 UTC
31-MAR-19 05.45.36.000000 AM +00:00

언급URL : https://stackoverflow.com/questions/22689021/oracle-sql-converting-timestamp-to-utc

반응형