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:
- Mengabaikan waktu zona sama sekali di Rails dan PostgreSQL
- Bagaimana cara mendapatkan tanggal dan waktu dari stempel waktu di kueri pemilihan PostgreSQL?
- Bagaimana cara membulatkan nilai milidetik dari timestamp(0) di PostgreSQL?