PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara mengubah bidang stempel waktu ke int8? Atau cukup jatuhkan kolom dan buat yang baru?

Pertama-tama, tujuannya tidak ditentukan tanpa menjelaskan apa yang int8 akan mewakili. Detik sejak zaman? Milidetik? Mikrodetik? (Tidak masalah dalam kasus khusus Anda dengan semua nilai NULL, tetapi pembaca berikutnya mungkin salah arah.)

Selanjutnya, di Postgres tidak ada pemeran yang ditentukan untuk timestamp --> bigint (pada dasarnya untuk alasan yang sama). Anda memerlukan ekspresi yang valid untuk USING klausa.

Dengan asumsi Anda menginginkan mikrodetik karena itu mempertahankan resolusi mikrodetik asli dari cap waktu Postgres, ini akan berhasil:

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;

Khususnya, zaman Postgres untuk cap waktu dimulai pada 2000-01-01 00:00:00 UTC, tidak seperti zaman UNIX yang dimulai pada 1970-01-01 00:00:00 UTC. Tapi extract() mengembalikan zaman UNIX (yang dapat dikonversi kembali ke timestamptz dengan to_timestamp() ). Jadi hanya mengonversi nilai internal tidak akan berhasil.

Untuk kasus khusus Anda (semua nilai NULL ), lebih mudah menggunakan text sebagai batu loncatan. Setiap jenis dapat dilemparkan dari dan ke text (selama nilainya kompatibel).

ALTER TABLE public.new_ambient_data
   ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;

Dan ya, mungkin lebih murah untuk mengonversi kolom di tempatnya, daripada menjatuhkan dan membuatnya kembali. Sementara kolomnya semuanya NULL, operasinya sangat murah, karena tidak ada data tupel yang sebenarnya, hanya sedikit di bitmap NULL. Keduanya tidak akan memicu penulisan ulang tabel.

Kolom yang baru ditambahkan selalu berada di akhir daftar kolom, sedangkan kolom yang dikonversi tetap di tempatnya. Tergantung pada apa yang Anda inginkan.

Terakhir, jangan lakukan sama sekali. Tipe data timestamp (atau timestamptz ) biasanya lebih unggul daripada menyimpan informasi temporal sebagai bigint generik generic dalam berbagai cara. Lihat detailnya di jawaban Laurenz!

Lihat:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres, perbarui, dan kunci pemesanan

  2. Hubungkan pyodbc ke Postgres

  3. Cara mengkonfigurasi SELinux untuk PostgreSQL dan TimescaleDB

  4. Dapatkan n kategori yang dikelompokkan dan jumlahkan yang lain menjadi satu

  5. PG::ConnectionBad:FATAL:otentikasi kata sandi gagal untuk pengguna alfa pengguna