2013-02-26 3 views
3

TIMESTAMPUTC milliseconds으로 변환하는 DB2 함수가 있습니까?DB2 TIMESTAMP를 UTC 밀리 초로 변환하려면 어떻게해야합니까?

+0

방금 ​​SQL에서이 작업을 수행하려고 :

그러나 그것은 할 수있는 UDF를 작성하는 사소한? – Lucas

+0

@ 루카스 : 주로 그렇습니다. 그러나 필요한 경우 로컬 함수도 만들 수 있습니다. – JSS

+1

왜? 그리고 귀하의 응용 프로그램 계층은 무엇입니까? 모든 것을 UTC 타임 스탬프로 저장 한 다음 좋은 라이브러리 (Java의 경우 [JodaTime] (http://joda-time.sourceforge.net/)와 같은)를 사용하여 응용 프로그램 만 변환하면 최상의 결과/가장 쉬운 작업을 수행 할 수 있습니다. . –

답변

0

TIMESTAMPDIFF을 사용할 수 있습니다. 다음과 같은 것 :

TIMESTAMPDIFF(1,CHAR(timestampField - 
    TIMESTAMP('1970-01-01-00.00.00.000000'))) 

유닉스 시대 이후의 밀리 초를 의미한다고 가정합니다. 필자는 이것을 테스트하지 않았기 때문에 db2 문서에만 이라고 표시되어 있기 때문에 값을 10 배로 조정해야 할 수도 있습니다. 초의 분수.

+5

불행히도 .... 아니 (나는 원한다). 두 가지 이유 - 1)'TIMESTAMPDIFF()'의 출력은 'INTEGER'로 제한되어 있으므로 자동으로 크기를 제한합니다. _seconds_는이 시점의 끝이 2038임을 의미합니다. 2) 두 타임 스탬프의 차이 출력은 부정확 한 ** 간격 **이므로 함수가 ** 견적 ** (즉, IBM을 심각하게 의미합니까?) 만 반환 할 수 있습니다. 이는 간격이 이혼 되었기 때문입니다 일광 절약 시간 또는 윤년과 같은 필요한 정보를 결정하는 데 도움이되는 정보로부터 얻을 수 있습니다. –

+0

@ Clockwork-Muse, 잘 설명되어 있습니다. 나는 그걸 깊이 파지 않았다. – Lucas

+0

'TIMESTAMPDIFF()'는 최악의 경우와 같습니다. 어림짐작의 좋은 규칙은 당신이 절대 사용해서는 안된다는 것입니다. –

2

신기원 (1970-01-01 00:00:00) 이래로 밀리 초 수를 얻으려고한다고 가정하면이 작업을 수행하는 기본 제공 함수가 없습니다.

CREATE OR REPLACE FUNCTION utcmillis (in db2ts timestamp) 
    returns bigint 
    language sql 
    deterministic 
    no external action 
    return (
     bigint((days(db2ts - current timezone) - days('1970-01-01-00.00.00.000000')) * 86400 + midnight_seconds(db2ts - current timezone))*1000 + microsecond(db2ts)/1000 
    ); 
+0

아쉽게도 요일은 항상 86400 초가 아닙니다. 코드가 DST 안전하지 않습니다. 또한, IBM이 시간대를 어떻게 처리하는지는 정확하지 않습니다. 동일한 옵셋에서 모든 시간대를 동일하게 처리하는 '오프셋'정의 만 사용하는 것 같습니다. 모든 국가에서 동시에 DST가 전환되는 것은 아닙니다 ... 또한이 코드는 들어오는 타임 스탬프에 모두 시간대가 포함되어 있고 '현재'상태 인 것으로 추정 할 수 있습니다. 이제 모든 타임 스탬프가 UTC로되어 있고 시간대와 관련하여 아무 것도하지 않으면이 작업이 가능합니다. –

+0

하루에 86,400 초가 항상 있어야하는 것은 기술적으로 정확하지만,이 UDF의 논리는 지정된 날짜/시간 (밀리 초를 제외하고 UNIX의 mktime() 함수에 대한 호출과 동일한 값을 생성합니다. 물론,'mktime()'은 초 단위 이하의 해상도를 가지고 있지 않기 때문에). –

+0

시간대의 경우 : DB2는'CURRENT TIMEZONE' 특수 레지스터를 사용하여 시간 소인 값을 처리하는 방법을 결정합니다. DB2는 SQL.이 실행될 때 운영 체제의 시간을 조회하여'CURRENT TIMEZONE' 레지스터의 값을 설정합니다. 따라서 'VALUES CURRENT TIMEZONE' 문을 실행 한 다음 데이터베이스 서버에서 시간대를 수정하고 동일한'VALUES CURRENT TIMEZONE' 문을 다시 실행하면 DB2가 새 시간대를보고합니다. –

관련 문제