sql >> データベース >  >> RDS >> PostgreSQL

タイムスタンプフィールドをint8に変換する方法は?または、列をドロップして新しい列を作成しますか?

    まず第一に、その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として保存するよりも優れています 複数の方法で。ローレンツの回答で詳細をご覧ください!

    参照:



    1. Java-Eclipse:パッケージoracle.jdbc.driverが存在しません

    2. MySQL挿入用の名前付きPDOパラメータをバインドするためのショートカットはありますか?

    3. Railsがmysqlに接続しようとしているのはなぜですか?

    4. MysqlデータベースをPHPフォームで更新する方法についての良いチュートリアルですか?