Chuyển đổi Postgres TIMESTAMP sang TIMESTAMPTZ


8

Tôi có một cơ sở dữ liệu chuỗi thời gian có kích thước vừa phải (~ 50 nghìn) chạy trên Postgres, với một số dữ liệu có cấu trúc khác (trong trường hợp cơ sở dữ liệu khác) nhỏ hơn nhiều.

Thật ngu ngốc, khi ban đầu tôi thiết kế thứ tôi có tất cả các lĩnh vực TIMESTAMP WITHOUT TIME ZONE, và bây giờ tôi đang trả tiền cho nó với các lỗi liên quan đến múi giờ gây phiền nhiễu. Tôi muốn mọi thứ phải rõ ràng, vì vậy muốn chuyển đổi trường thành TIMESTAMP WITH TIME ZONE. Tôi nhận ra rằng điều này không lưu trữ thêm thông tin và tất cả các dấu thời gian của tôi đã có trong UTC, vì vậy việc di chuyển sẽ không đáng kể, nhưng tôi tự hỏi liệu có bất kỳ điều gì phức tạp / khối vấp tiềm năng sẽ chứng minh có vấn đề không (đây là một sản phẩm cơ sở dữ liệu với khách hàng dựa vào nó)?

Câu trả lời:


13

Hãy chú ý rằng múi giờ chính xác (UTC trong trường hợp của bạn) được áp dụng trong quá trình chuyển đổi. Nếu không rõ ràng về điều này, múi giờ của phiên hiện tại được giả định - thường không phải là UTC.

ALTER TABLE tbl ALTER ts_column TYPE timestamptz USING ts_column AT TIME ZONE 'UTC';

Kiểm tra một mặc định cột có thể cho sự tỉnh táo, quá. Bất kỳ biểu thức nào làm việc với kiểu dữ liệu timestamp(như LOCALTIMESTAMPhoặc now()::timestamp) đều phải chịu cùng một vấn đề. Thay đổi:

ALTER TABLE tbl ALTER ts_column SET DEFAULT now(); -- or current_timestamp

Rõ ràng, các câu lệnh ghi vào bảng cũng cần phải sử dụng timestamptzngay bây giờ - hoặc bạn có một trường hợp khác của cùng một vấn đề với chuyển đổi tự động từ loại timestamp [without time zone].

Vì đây là DB sản xuất, tốt nhất nên thực hiện tất cả trong một giao dịch để tránh các điều kiện chạy đua - hoặc thậm chí là một tuyên bố duy nhất:

ALTER TABLE tbl
  ALTER ts_column TYPE timestamptz USING ts_column AT TIME ZONE 'UTC'
, ALTER ts_column SET DEFAULT now();

Khái niệm cơ bản:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.