2016-08-11 692 views
3

私は時系列データを格納するPostgreSQL DBで作業しています。 データは「タイムゾーン付きタイムゾーン」タイプを使用して保存され、出力はISO形式です(postgresqlのデフォルト値)。データソースは、「タイムゾーン付きタイムスタンプ」データ型のテーブルを作成するクローズドソースソフトウェアです。PostgreSQLでtimestamp(6)の代わりにtimestamp(0)をデフォルトとして設定するには?

タイムスタンプの精度は、Postgresのマニュアルに従って、6桁(マイクロ秒)までです。だから、私の時系列は毎秒記録され、私は出力にミリ秒を見ます。

e.g. 2012-06-25 15:46:23.001 

時系列データをプロットソフトウェアはミリ秒単位でクレイジー行くが、私は、タイムスタンプを使用するために、データ・ソース・ソフトウェアを変更することはできません(0)は、テーブルを作成するとき。

私の同僚は、すべての表の「時間帯とタイムスタンプ(0)」にタイムスタンプデータ型を変更するためにデータベース全体を照会する機能をプログラムします。それは正常に機能しますが、新しいテーブルが作成されるたびに実行する必要がある手動アクションです。私たちはこの関数の使用を避けたいと思います。

は、それが(0)、タイムスタンプデータ型の代わりに、デフォルトのタイムスタンプ(6)postgresql.confのを編集してタイムスタンプを作成するために、PostgreSQLのために言うことはできますか?

答えて

1

トリック(は、生産DB上でそれを実行しない!):

postgres=# alter type timestamptz rename to timestamptz6; 
ALTER TYPE 
postgres=# create domain pg_catalog.timestamptz as timestamptz6(0); 
CREATE DOMAIN 
postgres=# create table t (tz1 timestamp with time zone, tz2 timestamptz); 
CREATE TABLE 
postgres=# insert into t values(now(), now()); 
INSERT 0 1 
postgres=# select * from t; 
╔════════════════════════╤════════════════════════╗ 
║   tz1   │   tz2   ║ 
╠════════════════════════╪════════════════════════╣ 
║ 2016-08-11 21:06:17+03 │ 2016-08-11 21:06:17+03 ║ 
╚════════════════════════╧════════════════════════╝ 
(1 row) 

出来上がり!それでおしまい。

postgres=# drop table t; 
DROP TABLE 
postgres=# drop domain pg_catalog.timestamptz; 
DROP DOMAIN 
postgres=# alter type timestamptz6 rename to timestamptz; 
ALTER TYPE 

ご自身の責任でそれを使用してください:

は今、それは前にあったようにすべてのものを復元できます。そして成功を祈る。

+0

Yikes。 'pg_catalog'のネイティブタイプにドメインを代入すると、いろいろなことがエキサイティングになるでしょう。しかし、ねえ、狭いユースケースのため... –

+0

@CraigRingerなぜですか?既存のオブジェクトは名前ではなくOIDで型を参照します(関数本体を除く)、ドメイン自体が元の型を参照するため、暗黙の型キャストがここに残ります...しかし、あなたは正しいです。ケース。 – Abelisto

2

この処理は非常に深く、ハードコードされ、ユーザによって容易に変更することはできません。 (あなたが興味がある場合は、ソースコード内のAdjustTimestampForTypmod()を参照してください。)

あなたは、それはおそらくto_charを使用してtimestamp(0)やフォーマットにタイムスタンプ列をキャストし、テーブルの上にビューを作成し、そのビューであなたのレンダリングソフトウェアを指すことができます。

+0

また、レンダリングソフトウェアも調整できない場合は、「オンセレクト」ルールを作成してください。 – Abelisto

+0

@Abelisto:それはビューを作成するのと同じです。 –

+0

リレーション名の違い。プロットSWを変更できない場合(質問で不明)。 – Abelisto

関連する問題