まず第一に、そのint8
が何であるかを明確にせずに、目的は未定義です。 を表すつもりです。エポックからの秒数?ミリ秒?マイクロ秒? (すべてのNULL値を使用する特定のケースでは問題ありませんが、次の読者が誤った方向に進む可能性があります。)
次に、Postgresではtimestamp
にキャストが定義されていません -> bigint
(基本的に同じ理由で)。 USING
には有効な式が必要です 条項。
マイクロ秒が必要だと仮定 これはPostgresタイムスタンプの元のマイクロ秒の解像度を維持しているため、これでうまくいきます:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
特に、タイムスタンプのPostgresエポックは2000-01-01 00:00:00 UTCに始まります。これは、UNIXエポックが1970-01-0100:00:00UTCに始まるのとは異なります。ただし、 extract()
UNIXエポックを返します(timestamptz
に戻すことができます) to_timestamp()
)。したがって、内部値を変換するだけでは効果がありません。
特定の場合(すべての値がNULL )、text
を使用する方が簡単です 踏み石として。すべてのタイプをtext
との間でキャストできます (値に互換性がある限り)
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
はい、列を削除して再作成するよりも、列を所定の位置に変換する方がおそらく安価です。列はすべてNULLですが、実際のタプルデータはなく、NULLビットマップのビットのみであるため、どちらの方法でも操作は非常に安価です。どちらの方法でも、テーブルの書き換えはトリガーされません。
新しく追加された列は常に列リストの最後に移動しますが、変換された列はそのまま残ります。必要なものによって異なります。
最後に、しないでください まったく。データ型timestamp
(またはtimestamptz
)は通常、一時的な情報を一般的なbigint
として保存するよりも優れています 複数の方法で。ローレンツの回答で詳細をご覧ください!
参照:
- 時間を無視するRailsとPostgreSQLのゾーン全体
- PostgreSQLのselectクエリでタイムスタンプから日付と時刻を取得するにはどうすればよいですか?
- PostgreSQLでtimestamp(0)からミリ秒の値を四捨五入するにはどうすればよいですか?