5

ミリ秒単位のUnixタイムスタンプを使用できるSQLタイムスタンプに変換することを知っています

SELECT TO_DATE('1970-01-01','YYYY-MM-DD HH24:MI:SS') + 
       (:timestamp / (1000*60*60*24)) FROM DUAL;

しかし、タイムスタンプが必要なので、試してみました

SELECT TO_TIMESTAMP('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SSFF3') + 
       (:timestamp) from DUAL

エラーが表示されます:

エラー: ORA-01841: (完全な) 年は -4713 から +9999 の間である必要があり、0 であってはなりません

タイムスタンプに 1 を追加すると、常に 1 日に変換されるようです。

実際のタイムスタンプを取得するにはどうすればよいですか?

4

4 に答える 4

6

timestampa に aを追加するintervalと、a が得られますtimestamp(日付/間隔演算を参照してください)。

Benoit が気付いたように、約 2.1e9 を超える場合、秒で間隔を指定することはできません。

SQL> SELECT numtodsinterval(2.2e9, 'SECOND'),
  2         numtodsinterval(2.3e9, 'SECOND')
  3    FROM dual;

NUMTODSINTERVAL(2.2E9,'SECOND'  NUMTODSINTERVAL(2.3E9,'SECOND'
------------------------------- -------------------------------
+000024855 03:14:07.147483647   +000024855 03:14:07.147483647

これが、精度を失わない分を使用する必要がある理由です。たとえば、:TSが UNIX タイムスタンプ (つまり、数値) であるとします。

SQL> variable ts number;
SQL> -- determining unix timestamp with nanosecond precision
SQL> BEGIN
  2     :ts := (to_date('2099-01-01 01:02:03', 'yyyy-mm-dd hh24:mi:ss')
  3              - date '1970-01-01') * 1000*60*60*24
  4            + 123.456789;
  5  END;
  6  /

ts
---------
4070912523123,456789

SQL> select timestamp '1970-01-01 00:00:00'
  2         + numtodsinterval((:ts)/1000/60, 'MINUTE')
  3    from dual;

TIMESTAMP'1970-01-0100:00:00'+NUMTODSINTERVAL((:TS)/1000/60,'MINUTE')
---------------------------------------------------------------------------
2099-01-01 01:02:03.123456789
于 2013-03-20T10:13:02.500 に答える
2

次の 2 つのタイプがあります。

  • タイムスタンプ
  • 間隔

間隔は、タイムスタンプを差し引いたときに得られるものであり、タイムスタンプを足し合わせるのは無意味です。

ミリ秒間隔を取得する必要がある場合は、秒間隔を使用して 1000 で割ることをお勧めします。

私は提案することができます:

SELECT timestamp'1970-01-01 00:00:00' + (interval '1888' second(9) / 1000)
  FROM dual

ここでの問題は、同じタイムスタンプ リテラルで 9 桁を超える数字を使用できないことです。

エポックに 2,061,464,797,255 ミリ秒を追加する必要がある場合は、次のことをお勧めします。

SELECT TIMESTAMP'1970-01-01 00:00:00'
       + INTERVAL '2' SECOND(9) * 1000000000
       + INTERVAL '061464797' SECOND(9)
       + INTERVAL '255' SECOND(3) / 1000
  FROM dual

2035-04-29 13:06:37.255000000 を取得します

2038 バグの影響を受けているようです: TIMESTAMP'1970-01-01 00:00:00' + 30 億秒は機能しませんが、20 億秒では機能します。

于 2013-03-20T10:13:56.190 に答える
0

使用する

SELECT TIMESTAMP '1970-01-01 00:00:00.1234' + INTERVAL '1 00:00:00' DAY TO SECOND  
       AS ts
  FROM dual;
于 2013-03-20T10:03:18.800 に答える