2016-10-04 2 views
0

SQL Developer에서 "date + % s % 3N"linux 명령을 복제해야합니다. 아래 코드 샘플을 시도했지만 다른 값을 반환합니다. 나는 또한 행운을 빌어 Google을 광범위하게 검색했다.SQL Developer에서 총 시간 (밀리 초 단위) 생성

select to_char((extract(day from (systimestamp - timestamp '1970-01-01 00:00:00')) * 86400000 
+ extract(hour from (systimestamp - timestamp '1970-01-01 00:00:00')) * 3600000 
+ extract(minute from (systimestamp - timestamp '1970-01-01 00:00:00')) * 60000 
+ extract(second from (systimestamp - timestamp '1970-01-01 00:00:00')) * 1000) * 1000) unix_time 
from dual; 

날짜 + 등의 %의 % 3N 명령이 리턴 뭔가 :

1475594089419116

날짜 명령이 리턴 : 위의 코드 샘플 반면

1475615656692870653

같은 뭔가를 반환 코드 샘플 이전에 실행되었지만 코드 샘플보다 길거나 큰 수입니다. 가능한 경우 오라클의 궁극적 인 솔루션은 직접 유틸리티입니다. 그렇지 않으면 Oracle 내에서 date 명령을 호출 할 가능성이 있습니다.

+0

그건 여분의 수학이 많아요. 왜 각 개별 시간 구성 요소를 추출해야하며 초 단위로 곱하면됩니까? http://stackoverflow.com/questions/12105691/convert-timestamp-datatype-into-unix-timestamp-oracle 당신이 가진 모든 것은 날짜 "수학"의 단 하나의 비트로 할 수 있습니다. –

+1

데이터베이스 서버의 시간대는 무엇입니까? 유닉스 시간은'1970-01-01 00:00:00 UTC'를 기준으로합니다! –

+0

당신은'extract (second from ...) * 1000) * 1000' 즉 마이크로 초를 만듭니다. 너가 원하는게 그거야? –

답변

0

이 링크에 설명 된 방법을 사용하여 oscommands를 사용하여 작업을 마무리했습니다. http://www.orafaq.com/scripts/plsql/oscmd.txt. 아래의 솔루션은 올바른 방향으로 나아가는 단계 였지만 스크립트의 다른 부분은 문제가되었습니다. oscommands를 사용하여 우리의 모든 문제를 해결했습니다. 링크에 언급 된 방법을 사용하면 정확한 숫자를 얻으려면 간단히

l_time := oscomm('/bin/date +%s%3N'); 

을 입력 할 수있었습니다.

0

이 하나를 시도

CREATE OR REPLACE FUNCTION GetUnixTime RETURN INTEGER IS 
    dsInt INTERVAL DAY(9) TO SECOND; 
    res NUMBER; 
BEGIN 

    dsInt := CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC'; 
    res:= EXTRACT(DAY FROM dsInt)*24*60*60 
     + EXTRACT(HOUR FROM dsInt)*60*60 
     + EXTRACT(MINUTE FROM dsInt)*60 
     + EXTRACT(SECOND FROM dsInt); 
    RETURN ROUND(1000*res); 
END GetUnixTime; 

ROUND(1000*res)

밀리초에서 유닉스 시간을 반환합니다, 귀하의 질문에 따라 당신이 밀리 초, 마이크로 초 또는 나노초를 얻기 위해 같은인지 명확하지 않다. 그러나 결과를 원하는 값으로 변경하는 방법은 매우 분명합니다.

이 기능은 현지 시간대와 (항상 UTC입니다) 유닉스 시대의 시간대는 함수가 마음에 들지 않으면

, 당신은 물론 쿼리에 기록 할 수 있습니다 고려

:

SELECT 
    ROUND(EXTRACT(DAY FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*24*60*60 
     + EXTRACT(HOUR FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*60*60 
     + EXTRACT(MINUTE FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC')*60 
     + EXTRACT(SECOND FROM CURRENT_TIMESTAMP - TIMESTAMP '1970-01-01 00:00:00 UTC') 
    * 1000) AS unix_time 
FROM dual;