2017-10-17 6 views
4

残念ながら、postgresqlのタイムスタンプ型は、マイクロ秒精度のタイムスタンプしか格納できませんが、ナノ秒も必要です。postgresqlでnanosecでタイムスタンプを保存する最もエレガントな方法は何ですか?

PostgreSQL - 8.5. Date/Time Types:

タイムスタンプ、及び間隔は、秒フィールドに保持されている小数点以下の桁数を指定するオプションの精度値pを受け入れます。デフォルトでは、精度には明示的な境界はありません。有効なpの範囲は、タイムスタンプとインターバルタイプで0〜6です。

と私は7を必要とする:

0000 000 001 [億]ナノ秒[ns]で

0000 001 [万]マイクロ[μsの]

0001 [千]ミリ秒の[をMS]

0.01 [百]センチ[CS]

1.0秒[秒]

この問題を処理するうえで効率的な方法はありますか?

EDIT: bigintにタイムスタンプを保存することはありますか?

+0

これらは識別用にのみ必要ですか? – joop

+2

ナノ秒のタイムスタンプをデータベースに提供するのは誰ですか? – jarlh

+0

独自のC関数を記述して現在のナノ秒を取得し、それをカスタムデータ型に格納することをお勧めします。とにかく私はこれが重複していると思います:https://stackoverflow.com/questions/41514225/postgresql-support-for-timestamps-to-nanosecond-resolution – JustMe

答えて

3

BIGINTます作業。ナノ秒の精度ですべてのタイムスタンプを保存する場合は、新しいキャストを定義することをお勧めします。

CREATE CAST (timestamp AS bigint) 
WITHOUT FUNCTION; 
2

ナノタイムスタンプの基本タイプとしてnumericを使用してください。関数は、テキスト形式のタイムスタンプ表現に数値を変換します

create or replace function nanotimestamp_as_text(numeric) 
returns text language sql immutable as $$ 
    select concat(to_timestamp(trunc($1))::timestamp::text, ltrim(($1- trunc($1))::text, '0')) 
$$; 

ます。また、簡単に例、スーパー精度が必要でない場合には、通常のタイムスタンプに数値を変換することができます:

with my_data(nano_timestamp) as (
    select 1508327235.388551234::numeric 
) 

select 
    to_timestamp(nano_timestamp)::timestamp, 
    nanotimestamp_as_text(nano_timestamp) 
from my_data; 

     to_timestamp  |  nanotimestamp_as_text  
----------------------------+------------------------------- 
2017-10-18 13:47:15.388551 | 2017-10-18 13:47:15.388551234 
(1 row) 
関連する問題