programing

오라클 unix epoch 시간을 날짜로 변환

starjava 2023. 7. 11. 21:24
반응형

오라클 unix epoch 시간을 날짜로 변환

우리 제품에 EPOH 번호를 생성하여 기존 오라클 프로시저로 전송하거나 그 반대의 경우에도 EPOH 번호를 생성하는 기존 애플리케이션이 있다는 것이 맥락입니다.다음과 같은 것을 사용하여 그 절차에서 작동합니다.

SELECT UTC_TO_DATE (1463533832) FROM DUAL
SELECT date_to_utc(creation_date) FROM mytable

이러한 쿼리를 사용해 보니 Oracle 10g 서버(및 Oracle SQL developer 4.x)에서도 작동합니다.

기존 절차에서는 값을 날짜 자체로 저장해야 했지만(시간 구성 요소는 관련이 없음), 새로운 요구 사항에서는 unix EPOW 값을 날짜/분/초 수준으로 변환하거나 오라클 쿼리에서 dd-MMM-yyyyh:mm:ss와 같은 특정 형식으로 더 잘 변환해야 합니다.이상하게도 구글의 UTC_TO_DATE 및 DATE_TO_UTC 함수에 대한 문서를 찾을 수 없습니다.스택 오버플로에 대한 모든 다양한 질문을 둘러보았지만 대부분 php, java 등 프로그래밍 언어에 특화되어 있습니다.

결론적으로 오라클 쿼리에서 이러한 함수(또는 다른 함수)를 사용하여 EPOK를 해당 수준의 시간으로 변환하는 방법은 무엇입니까?추가로 제가 언급하고 있는 기능은 사용자 지정 기능이거나 특정 기능일 수 있습니다. 이 기능에 대한 설명서나 참조가 없습니다.

epoch에서 밀리초 단위로 변환하는 방법(epoch가 1970년 1월 1일이라고 가정):

select to_date('19700101', 'YYYYMMDD') + ( 1 / 24 / 60 / 60 / 1000) * 1322629200000
from dual;

11/30/2011 오전 5:00

해당 날짜를 밀리초로 다시 변환하는 방법

select (to_date('11/30/2011 05:00:00', 'MM/DD/YYYY HH24:MI:SS') - to_date('19700101', 'YYYYMMDD')) * 24 * 60 * 60 * 1000
from dual;

1322629200000

밀리초가 아닌 초인 경우 방정식의 1000 부분을 생략합니다.

select to_date('19700101', 'YYYYMMDD') + ( 1 / 24 / 60 / 60 ) * 1322629200
from dual;

select (to_date('11/30/2011 05:00:00', 'MM/DD/YYYY HH24:MI:SS') - to_date('19700101', 'YYYYMMDD')) * 24 * 60 * 60
from dual;

도움이 되길 바랍니다.

다른 옵션은 간격 유형을 사용하는 것입니다.

SELECT TO_TIMESTAMP('1970-01-01 00:00:00.0'
                   ,'YYYY-MM-DD HH24:MI:SS.FF'
       ) + NUMTODSINTERVAL(1493963084212/1000, 'SECOND')
FROM dual;

밀리초가 단축되지 않는 장점이 있습니다.

에포크 시간이 정수로 저장된 경우...또한 Oracle 날짜 형식으로 변환해야 합니다.

1단계--> Epoch 날짜(1462086000)를 표준 01-jan-1970에 추가합니다. 86400은 24시간의 초입니다.

*Select TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 from dual*  
   **output is 5/1/2016 7:00:00 AM**

2단계--> CHAR로 변환합니다.추가 기능을 적용하기 전에 포맷해야 합니다.

  *Select TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss') from dual*

   output is  2016-05-01 07:00:00

3단계--> 타임스탬프 변환으로 이동합니다.

Select to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss') from dual

  output is 5/1/2016 7:00:00.000000000 AM

4단계--> 이제 시간대, UTC 사용이 필요합니다.

Select from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  from dual

     output is 5/1/2016 7:00:00.000000000 AM +00:00

5단계--> 시간대가 PST인 경우

 Select from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  at time zone 'America/Los_Angeles' TZ from dual

           output is 5/1/2016 12:00:00.000000000 AM -07:00

6단계--> PST 시간대 타임스탬프를 포맷합니다.

 Select to_Char(from_tz(to_timestamp(TO_CHAR(TO_DATE('01-jan-1970',   'dd-mon-yyyy') + 1462086000/86400 ,'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd hh24:mi:ss'),'UTC')  at time zone 'America/Los_Angeles' ,'DD-MON-YYYY HH24:MI:SS') TZ from dual 

          output is  01-MAY-2016 00:00:00

7단계--> 마지막으로, 열이 날짜 데이터 유형인 경우

   Add to_DATE to the whole above Select. 

여기서는 UTC/GMT 및 EST 모두에 대한 값입니다.

GMT  select (to_date('1970-01-01 00','yyyy-mm-dd hh24') +
     (1519232926891)/1000/60/60/24) from dual;

EST  select new_time(to_date('1970-01-01 00','yyyy-mm-dd hh24') + 
     (1519232926891)/1000/60/60/24, 'GMT', 'EST') from dual;

저는 누군가가 이것의 Oracle 함수 버전을 보고 싶어할 것이라고 생각했습니다.

CREATE OR REPLACE FUNCTION unix_to_date(unix_sec NUMBER)
RETURN date
IS
ret_date DATE;
BEGIN
    ret_date:=TO_DATE('19700101','YYYYMMDD')+( 1/ 24/ 60/ 60)*unix_sec;
    RETURN ret_date;
END;
/

날짜가 필요한 레코드가 많아서 다음을 사용하여 테이블을 업데이트했습니다.

update bobfirst set entered=unix_to_date(1500000000+a);

여기서 a는 1에서 10,000,000 사이의 숫자입니다.

타임스탬프를 나노초로 변환하는 더 짧은 방법입니다.

SELECT (EXTRACT(DAY FROM (
    SYSTIMESTAMP --Replace line with desired timestamp --Maximum value: TIMESTAMP '3871-04-29 10:39:59.999999999 UTC'
- TIMESTAMP '1970-01-01 00:00:00 UTC') * 24 * 60) * 60 + EXTRACT(SECOND FROM
    SYSTIMESTAMP --Replace line with desired timestamp
)) *  1000000000 AS NANOS FROM DUAL;

NANOS
1598434427263027000

나노초를 타임스탬프로 변환하는 방법입니다.

SELECT TIMESTAMP '1970-01-01 00:00:00 UTC' + numtodsinterval(
    1598434427263027000 --Replace line with desired nanoseconds
/ 1000000000, 'SECOND') AS TIMESTAMP FROM dual;

TIMESTAMP
26/08/20 09:33:47,263027000 UTC

예상대로, 위 방법의 결과는 시간대의 영향을 받지 않습니다.

간격을 나노초로 변환하는 더 짧은 방법입니다.

SELECT (EXTRACT(DAY FROM (
    INTERVAL '+18500 09:33:47.263027' DAY(5) TO SECOND --Replace line with desired interval --Maximum value: INTERVAL '+694444 10:39:59.999999999' DAY(6) TO SECOND(9) or up to 3871 year
) * 24 * 60) * 60 + EXTRACT(SECOND FROM (
    INTERVAL '+18500 09:33:47.263027' DAY(5) TO SECOND --Replace line with desired interval
))) * 1000000000 AS NANOS FROM DUAL;

NANOS
1598434427263027000

나노초를 간격으로 변환하는 방법입니다.

SELECT numtodsinterval(
    1598434427263027000 --Replace line with desired nanoseconds
/ 1000000000, 'SECOND') AS INTERVAL FROM dual;

INTERVAL
+18500 09:33:47.263027

예상대로 millis, micro, nano가 변환되어 되돌립니다. SYSTIMAMP에도 불구하고 nanosound 정보가 없습니다.

예를 들어 나노초 대신 밀리초 단위로 작업하려는 경우 1000000000을 1000으로 대체합니다.

게시 방법을 몇 가지 시도해 보았지만, 거의 대부분 시간대에 영향을 받거나 복구 후 데이터 손실에 영향을 받기 때문에 저에게 적합한 방법을 게시하기로 결정했습니다.

언급URL : https://stackoverflow.com/questions/37305135/oracle-convert-unix-epoch-time-to-date

반응형