Bối cảnh:
Chúng tôi hiện đang chạy PostgreSQL 8.4 trong sản xuất và đang thử nghiệm nội bộ 9.2 để nâng cấp trong tương lai. Một số vấn đề đã nổi lên liên quan đến ngày. Các máy chủ chạy 8.4 so với 9.2 giống hệt nhau theo mọi cách khác với các phiên bản và cấu hình của PostgreSQL. Dữ liệu chính xác giống nhau được lưu trữ trên cả hai bộ máy chủ; nó được chuyển bằng cách sử dụng pg_dump
và pg_restore
.
Trong một phần của cơ sở dữ liệu của chúng tôi, chúng tôi lưu trữ ngày trong một trường loại timestamp without time zone
.
Vấn đề:
Khi truy cập ngày từ trường đó, một extract(epoch..)
yêu cầu trả về các kết quả rất khác nhau tùy thuộc vào phiên bản Postgres, như vậy:
#On Postgres 8.4. entered_timestamp is a "timestamp without time zone" type column:
SELECT entered_timestamp, extract(epoch from entered_timestamp) AS entered_timestamp from <table row>
entered_timestamp | entered_timestamp
----------------------------+-------------------
2012-11-01 06:01:39.699612 | 1351774899.69961
Nhưng...
#On Postgres 9.2. All tables, schema, and data are identical, the SELECT statement is identical to the previous one:
SELECT entered_timestamp, extract(epoch from entered_timestamp) AS entered_timestamp from <table row>
entered_timestamp | entered_timestamp
----------------------------+-------------------
2012-11-01 06:01:39.699612 | 1351749699.69961
Như bạn có thể thấy, dấu thời gian được trả về là giống hệt nhau, nhưng số epoch được trả về thì không; trong thực tế, họ được nghỉ vài giờ. Ngày của máy chủ và múi giờ Linux trên cả hai máy chủ giống hệt nhau (trong vòng một giây với nhau). Các múi giờ của Postgres cũng giống hệt nhau: chạy SELECT current_setting('timezone')
trên cả hai máy chủ cũng trả về cùng một dữ liệu. Chạy SELECT now()
trên cả hai máy chủ trả về giá trị gần giống nhau.
Câu hỏi:
Hành vi của
extract(epoch...)
các trường loạitimestamp without time zone
đã thay đổi như thế nào giữa PostgreSQL 8.4 và PostgreQuery 9.2?Tại sao sự thay đổi này xảy ra?
Có cách nào để ngăn chặn thay đổi này mà không thay đổi lược đồ của tôi hoặc thay đổi dữ liệu trong quá khứ (tức là sửa lỗi dựa trên cấu hình) không?