23

とてもシンプルだと思っていましたが、そうではありません。

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;

なんで?それはどのように機能しますか?

4

5 に答える 5

31

リテラルとして表現された時間を加算または減算するには、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 秒は次のとおりです。

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

ミリ秒を取得するには、1000 で割ります。

1 / (24 * 60 * 60 * 1000)
于 2012-09-07T00:23:27.377 に答える
11
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.
于 2012-08-10T11:21:43.420 に答える
9

上記の回答では、日付から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 時間の 1/(600*60*1000) はミリ秒ではなく 1/10 ミリ秒であるため、その数値は間違っています。'HOUR' を使用する場合は、(1 時間に 60 分、1 分間に 60 秒、1 秒に 1000 ミリ秒)NUMTODSINTERVAL()を使用する必要があります。1/(60*60*1000)

于 2012-09-06T12:54:06.577 に答える
7

これは正しいです (ミリ秒は 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 時間を 60 で割り、秒を表すには 60 で割り、ミリ秒を表すには 1000 で割る必要があります。

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
于 2012-09-06T12:44:07.493 に答える
2
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
于 2012-09-06T13:57:03.253 に答える