2010-08-23 2 views
6

오라클 날짜에 :XSD 날짜 XS 변환 : 날짜 _ 시간을 나는이 형식에서 날짜를 변환 할 필요가

2002-10-10T12 : 00 : 00-05 : 00 (XS : dateTime으로 정의 XML로)

에서 오라클 날짜.

PL/SQL : to_date ('date here', 'yyyymmdd')에서 이것을 사용하는 데 시간대 정보를 유지하면서 변환하는 방법이 있습니까?

감사

+0

@ user412045 : 질문이 명확하지 않습니다. 이 '2002-10-10T12 : 00 : 00-05 : 00'을 '20021010'으로 변환 하시겠습니까? "시간대 정보 유지"란 무엇을 의미합니까? –

+0

2002-10-10T12 : 00 : 00-05 : 00을 Oracle Date로 변환하고 싶습니다. 20021010은 그저 하나의 예일뿐입니다. 시간대 정보를 유지함으로써 나는 완전한 날짜 시간을 가져올 수 있기를 원한다는 것을 의미합니다. 감사합니다 – MoreCoffee

답변

7

오라클 날짜 시간대 정보가 없습니다. 대신 TIMESTAMP 데이터 유형을 사용해야합니다. XSD를 표기에 T의 까다로운 문제가있다,

SQL> desc tz 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
ID             NUMBER 
TS             TIMESTAMP(6) WITH TIME ZONE 
TNOW            TIMESTAMP(6) WITH TIME ZONE 

SQL> insert into tz 
    2 values (1 
    3   , to_timestamp_tz('2002-10-10 12:00:00-05:00' 
    4       , 'YYYY-MM-DD HH24:MI:SSTZH:TZM') 
    5   , systimestamp) 
    6/

1 row created. 

SQL> select * from tz 
    2/

     ID 
---------- 
TS 
--------------------------------------------------------------------------- 
TNOW 
--------------------------------------------------------------------------- 
     1 
10-OCT-02 12.00.00.000000 -05:00 
23-AUG-10 17.37.06.502000 +01:00 


SQL> 

참고 :

이 같은 것을 사용할 수 있습니다. 이는 오라클에서 유효한 형식이 아니기 때문에 ORA-01858 예외를 발생시킵니다. 나는 해결책이 있다고 확신하지만, 현재 그것은 나를 도망 간다. 밥 같이


잘 하나의 해결 방법은, SUBSTR() 함수 STO 분할은 타임 스탬프의 두 부분으로 열 적용하는 것이다. 그러나 더 우아한 방법이 있어야합니다.

SQL> insert into tz 
    2 values (2 
    3   , to_timestamp_tz(translate('2003-10-10T12:00:00-05:00', 'T', ' ') 
    4     , 'YYYY-MM-DD HH24:MI:SSTZH:TZM') 
    5   , systimestamp) 
    6/

1 row created. 

SQL> select * from tz 
    2/

     ID 
---------- 
TS 
--------------------------------------------------------------------------- 
TNOW 
--------------------------------------------------------------------------- 
     1 
10-OCT-02 12.00.00.000000 -05:00 
23-AUG-10 17.37.06.502000 +01:00 

     2 
10-OCT-03 12.00.00.000000 -05:00 
23-AUG-10 17.53.37.113000 +01:00 


SQL> 

을하지만 오라클이있는 모든 노력을 제공 : 아마 "우아한"로 자격이되지 않습니다하지만이 문자열의 우리가 대체 기능을 사용할 수 있습니다


은 성가신 T 없애 XMLDB에 넣으면 오히려 정돈 된 해결책이 없다는 것을 성가 시게한다.


는 "나는 당신이 -05 얻을 방법을 이해 해달라고 :. 00"

원본 샘플에는 'YYYY-MM-DD HH24:MI:SS-TZH:TZM'의 형식 마스크를 사용합니다. 그러면 -은 시간대에서 구분 기호 이 아닌 빼기 기호로 해석됩니다. 결과적으로 +05 : 00을 반환했습니다. 이후 코드 샘플을 수정하여 마지막 대시를 제거했습니다. 이제 시간대가 올바르게 -05 : 00로 렌더링됩니다. 혼란스러워서 죄송합니다.

+0

감사합니다 !! 그러나 실행할 때 to_timestamp_tz (번역 ('2003-10-10T12 : 00 : 00-05 : 00', 'T', '') 'YYYY-MM-DD HH24 : MI : SS-TZH : TZM ') 이중에서; 10-OCT-03 12.00.00.000000000 PM +05 : 00 (나는 -05 : 00이 아닌 +05 : 00을 얻으려고한다)? – MoreCoffee

+0

나는 어떻게 당신이 -05 : 00을 얻는 지 이해하지 못한다 .. – MoreCoffee

+0

완벽하게, 정확히 내가 필요로하는 것 – MoreCoffee

2

다음은이를 DATE 및 TIMESTAMP WITH TIME ZONE 데이터 유형으로 변환하는 방법의 예입니다. 날짜를 (TIME ZONE 함께 TIMESTAMP의 전환에서) 정보가 손실되는 시간대를 입력합니다 : 그냥 그것의 재미를 위해


declare 
    strDate  VARCHAR2(32767); 
    tzDate  TIMESTAMP WITH TIME ZONE; 
    dtDate  DATE; 
    nTimezone NUMBER; 
    dtDate_GMT DATE; 
begin 
    strDate := '2002-10-10T12:00:00-05:00'; 

    dtDate := TO_TIMESTAMP_TZ(SUBSTR(strDate, 1, 10) || 
          SUBSTR(strDate, 12, 8) || ' ' || 
          SUBSTR(strDate, 20, 6), 'YYYY-MM-DDHH:MI:SS TZH:TZM'); 
    tzDate := TO_TIMESTAMP_TZ(SUBSTR(strDate, 1, 10) || 
          SUBSTR(strDate, 12, 8) || ' ' || 
          SUBSTR(strDate, 20, 6), 'YYYY-MM-DDHH:MI:SS TZH:TZM'); 
    nTimezone := TO_NUMBER(SUBSTR(strDate, 20, 3)) + 
       (TO_NUMBER(SUBSTR(strDate, 24, 2))/60); 
    dtDate_GMT := dtDate - ((INTERVAL '1' HOUR) * nTimezone); 

    dbms_output.put_Line('dtDate=' || dtDate); 
    dbms_output.put_Line('dtDate=' || TO_CHAR(dtDate, 'YYYY-MM-DD HH24:MI:SS')); 
    dbms_output.put_line('tzDate=' || tzDate); 
    dbms_output.put_line('tzDate=' || TO_CHAR(tzDate, 'YYYY-MM-DD HH24:MI:SS TZH:TZM')); 
    dbms_output.put_line('nTimezone=' || nTimezone); 
    dbms_output.put_Line('dtDate_GMT=' || TO_CHAR(dtDate_GMT, 'YYYY-MM-DD HH24:MI:SS')); 
end; 
나는 시간대를 끌어 예제에 몇 가지 코드를 추가 문자열을 제거한 다음 현지 시간에 표준 시간대를 추가하여 GMT/UTC를 얻습니다.

공유하고 즐기십시오.

9

짧은 대답 :

SQL> select to_timestamp_tz('2002-10-10T12:00:00-05:00','yyyy-mm-dd"T"hh24:mi:sstzh:tzm') 
    2 from dual 
    3/

TO_TIMESTAMP_TZ('2002-10-10T12:00:00-05:00','YYYY-MM-DD"T"HH24:MI:SSTZH:TZM 
--------------------------------------------------------------------------- 
10-OCT-02 12.00.00.000000000 PM -05:00 

1 row selected. 

감사 롭.