2013-10-24 3 views
1

나는 유닉스 시대 이후로 밀리 초를 날짜/시간으로 변환해야하는 PL/SQL 초보자입니다. GMT 날짜/시간으로 변환 할 수 있지만 시간대에 맞게 을 조정하는 방법을 알지 못합니다. 나는 가까이 있지만 아주 거기에 있지 않습니다.오라클 : 시간대가 포함 된 날짜/시간의 에포크 밀리 초

내 입력이

MpD NUMBER  := (1/24/60/60/1000);  -- Milleseconds per Day 

DFmt24 VARCHAR2(21) := 'MM/DD/YYYY HH24:MI:SS'; -- Date format 

TMPorig24  VARCHAR2(20); 

. . . 

TMPorig24 := TO_CHAR(DATE '1970-01-01' + MpD * r_msg.OriginationTime, DFmt24); 

가 나는 그것이 GMT의 제외 할 것입니다

10/23/2013 18:15:00 

같은 것을 제공 1382552100277

같은 값을 가지고 r_msg.OriginationTime이다.

TimeZoneOffset VARCHAR(7); 

    . . . 

    TimeZoneOffset := tz_offset('America/New_York'); 

-04:00 

그래서 난 그냥

TMPorig24 := TMPorig24 + TimeZoneOffset; 

같은 것을 할 필요가 있습니다하지만 난

ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
를 얻을 수

몇 가지 변형을 시도했지만 아무 효과가 없습니다.

도움을 주시면 감사하겠습니다.


감사합니다.하지만 두 가지 해결책에 문제가 있습니다.

첫 번째 해결 방법은 시간대와 상관없이 동일한 시간을 인쇄합니다. 예를 들어, 동일한 값을 인쇄합니다.

TMPorig = TO_CHAR ( FROM_TZ (CAST (DATE TIMESTAMP AS '1970-01-01'+ (1/24/60/60/1000) * r_msg.OriginationTime), '미국/뉴욕') ' MM/DD/YYYY HH24 : MI : SS ');

TMPorig2 = TO_CHAR ( FROM_TZ (CAST (DATE '1970-01-01'+ (1/24/60/60/1000) * r_msg.OriginationTime TIMESTAMP AS), "태평양/Pago_Pago ')' MM/DD/YYYY HH24 : MI : SS ');

제 2 용액

TMPorig = TO_CHAR ( DATE '1970-01-01'+ (1/24/60/60/1000) * r_msg.OriginationTime + INTERVAL '-04 : 00 HOUR 분, 'MM/DD/YYYY HH24 : MI : SS'); 일광 절약 시간이 끝날 때 잘못된 것 '00 :

PLS-00166: bad format for date, time, timestamp or interval literal 

Moveover, '04을 제공합니다. EST/EDT와 GMT 사이의 시간차에 대한 표현식이 필요합니다.

** ** * * ** * 작동이 PERFECT THANKS * ** * ** ** * * ** * *

TMPorig2 : = TO_CHAR ((UTC) 시간대 '아메리카/뉴욕 _', 'MM/월 _ DD/YYYY HH24 : MI : SS ');


+0

좋아, 내 대답을 편집 한이 - 새로운 솔루션을 확인하십시오. –

답변

1

편집 : 좋아, 대신이 해결 방법을 시도해보십시오 :

SELECT 
    TO_CHAR (
    FROM_TZ (
     CAST (DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 AS TIMESTAMP), 
     'UTC') 
    AT TIME ZONE 'America/New_York', 
    'MM/DD/YYYY HH24:MI:SS') val 
FROM dual; 

출력 :

VAL    
------------------- 
10/23/2013 14:15:00

당신은 TIMESTAMPDATE 캐스팅하고 FROM_TZ 기능을 사용해야합니다을 변환하는을 TIMESTAMP WITH TIME ZONE 데이터 유형으로 변환하십시오. timezone 매개 변수는 America/New_York 또는 -04:00 형식 일 수 있습니다.

SELECT 
    TO_CHAR(
    FROM_TZ(
     CAST(DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 AS TIMESTAMP), 
     'America/New_York'), 
    'MM/DD/YYYY HH24:MI:SS') 
FROM dual; 

변수가 TIMESTAMP WITH TIME ZONE 인 경우입니다. 당신은 주어진 시간대 오프셋을 추가하려는 경우, 당신은 사용할 수 있습니다

SELECT 
    TO_CHAR(
     DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 + INTERVAL '-04:00' HOUR TO MINUTE, 
    'MM/DD/YYYY HH24:MI:SS') AS val 
FROM dual; 

출력 :

VAL    
------------------- 
10/23/2013 14:15:00
+0

이 기능은 저에게 큰 도움이됩니다 - 문자열에서 에포크 이후 초까지 다른 방식으로 코드를 사용합니까? – dldnh

+0

@dldnh 샘플 데이터를 제공 할 수 있으며 예상되는 출력은 무엇입니까? –