source

Oracle: 날짜 시간에서 밀리초 차감

manysource 2023. 6. 29. 20:12

Oracle: 날짜 시간에서 밀리초 차감

나는 그것이 정말 간단하다고 생각했지만 그렇지 않습니다.

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') 
          - 1/(24*50*60*1000) data 
FROM dual;

그것은 단순히 작동하지 않습니다.


기타 세부 정보:

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') -
           NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data 
FROM dual;

작동하지 않습니다.

오른쪽은.

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') -
           NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR') data 
FROM dual;

왜요? 어떻게 작동하죠?

리터럴로 표현된 시간을 더하거나 빼는 데에는 INTERVAL을 사용할 수 있습니다.

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')
     - INTERVAL '0.001' SECOND 
FROM dual;

또한 날짜 및 시간 리터럴을 표현하고 다양한 데이터베이스별 변환 기능의 사용을 피하는 표준 방법이 있습니다.

SELECT TIMESTAMP '2012-10-08 00:00:00' 
   - INTERVAL '0.001' SECOND DATA
FROM dual;

원래 질문의 경우 하루의 시간 부분이 분수 일 단위로 저장됩니다.그래서 1초는:

1 / (hours in day * minutes in hour * seconds in a minute)

밀리초를 얻으려면 1000으로 나눕니다.

1 / (24 * 60 * 60 * 1000)
SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/(24*50*60*1000),'HOUR') data 
FROM dual;

산출량

DATA                             
---------------------------------
09/AUG/12 11:59:59.999950000 PM  

1 row selected.

위에 게시된 답변은 날짜에서 1/10 밀리초를 뺀 것입니다.당신이 원하는 것은 다음과 같습니다.

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY')-NUMTODSINTERVAL(1/1000,'SECOND')
  FROM dual;

출력:

DATA
---------------------------------------------------------------------------
09-AUG-12 11.59.59.999000000 PM
                   ^^^
                   |||
              tenths|thousandths
                    |
                hundredths

다음과 같은 것들NUMTODSINTERVAL(1/(24*25*60*1000),'HOUR')24*25 = 600 때문에 작동하는 것처럼 보입니다.그러나 시간의 1/(600*60*1000)은 1밀리초가 아니라 1밀리초의 10분의 1이기 때문에 이 수치는 잘못된 것입니다.'HOUR'을 사용하려면NUMTODSINTERVAL()사용해야 합니다.1/(60*60*1000)(1시간에 204분, 1분에 60초, 1초에 1000ms).

정확합니다(밀리초는 1000분의 1초).

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/1000,'SECOND') data FROM dual;


DATA
-----------------------------
09-AUG-12 23.59.59.999000000

다른 코드가 작동하지 않는 이유는 1밀리초를 올바르게 계산하지 않았기 때문입니다.1시간을 60으로 나누면 분이 되고 다시 60에서 60초가 되고 1000으로 나누면 밀리초가 됩니다. 따라서 HOUR을 간격으로 사용해야 할 경우 다음과 같습니다.

SELECT TO_TIMESTAMP('10/08/2012','DD/MM/YYYY') - NUMTODSINTERVAL(1/(60*60*1000),'HOUR') as data FROM dual;

DATA
---------------------------------------------------------------------------
09-AUG-12 23.59.59.999000000
select TO_CHAR(TO_TIMESTAMP('10.05.2012', 'DD.MM.YYYY') - 
       NUMTODSINTERVAL(1/1000, 'SECOND'), 'DD.MM.YYYY HH24:MI:SS:FF3')  Res 
  from dual;

RES
-----------------------------
09.05.2012 23:59:59.999

언급URL : https://stackoverflow.com/questions/11900470/oracle-subtract-millisecond-from-a-datetime