Trước hết, mục tiêu không được xác định nếu không xóa int8
đó là gì sẽ đại diện. Giây giây kể từ kỷ nguyên? Mili giây? Micro giây? (Sẽ không thành vấn đề trong trường hợp cụ thể của bạn với tất cả các giá trị NULL, nhưng người đọc tiếp theo có thể hiểu sai.)
Tiếp theo, trong Postgres không có diễn viên nào được xác định cho timestamp
-> bigint
(về cơ bản vì lý do tương tự). Bạn cần một biểu thức hợp lệ cho USING
mệnh đề.
Giả sử bạn muốn micro giây bởi vì đó là duy trì độ phân giải micro giây ban đầu của dấu thời gian Postgres, điều này sẽ thực hiện công việc:
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING (extract(epoch FROM sensor_date)*1000000)::int8;
Đáng chú ý, kỷ nguyên Postgres cho dấu thời gian bắt đầu lúc 2000-01-01 00:00:00 UTC, không giống như kỷ nguyên UNIX bắt đầu từ 1970-01-01 00:00:00 UTC. Nhưng extract()
trả về kỷ nguyên UNIX (có thể được chuyển đổi lại thành timestamptz
với to_timestamp()
). Vì vậy, chỉ chuyển đổi giá trị nội bộ sẽ không thực hiện được.
Đối với trường hợp cụ thể của bạn ( tất cả các giá trị NULL ), đơn giản hơn là sử dụng text
làm bước đệm. Mọi loại đều có thể được truyền từ và sang text
(miễn là giá trị tương thích).
ALTER TABLE public.new_ambient_data
ALTER COLUMN sensor_date TYPE int8 USING sensor_date::text::int8;
Và có, có lẽ rẻ hơn để chuyển đổi cột tại chỗ, hơn là thả và tạo lại nó. Mặc dù tất cả cột đều là NULL, nhưng thao tác này rất rẻ, vì không có dữ liệu tuple thực tế, chỉ có một chút trong bitmap NULL. Không có cách nào sẽ kích hoạt ghi lại bảng.
Cột mới được thêm vào luôn đi đến cuối danh sách cột, trong khi cột được chuyển đổi vẫn ở nguyên vị trí. Tùy thuộc vào những gì bạn muốn.
Cuối cùng, đừng làm điều đó ở tất cả. Loại dữ liệu timestamp
(hoặc timestamptz
) thường vượt trội hơn so với việc lưu trữ thông tin tạm thời dưới dạng bigint
chung chung bằng nhiều cách. Xem chi tiết trong câu trả lời của Laurenz!
Xem:
- Bỏ qua thời gian các vùng hoàn toàn trong Rails và PostgreSQL
- Cách lấy ngày và giờ từ dấu thời gian trong truy vấn chọn PostgreSQL?
- Làm cách nào để làm tròn giá trị mili giây từ dấu thời gian (0) trong PostgreSQL?