PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để chuyển đổi trường dấu thời gian thành int8? Hay chỉ cần bỏ cột và tạo một cột mới?

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PGAdmin:Không được kết nối với máy chủ hoặc kết nối với máy chủ đã bị đóng

  2. Hàm tổng hợp Postgres để tính trung bình vectơ của tốc độ gió (cường độ vectơ) và hướng gió (hướng vectơ)

  3. Di chuyển Heroku:công cụ sửa đổi kiểu không được phép cho kiểu bytea

  4. Sử dụng truy vấn Hibernate:dấu hai chấm được coi là tham số / dấu hai chấm thoát

  5. Bản ghi trả về từ hàm có các cột được nối với nhau