Tại sao / cách thức hoạt động của trích xuất (epochio) từ dấu thời gian mà không có các múi giờ Các trường thay đổi giữa PostgreQuery 8.4 và 9.2?


7

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_dumppg_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:

  1. Hành vi của extract(epoch...)các trường loại timestamp without time zoneđã thay đổi như thế nào giữa PostgreSQL 8.4 và PostgreQuery 9.2?

  2. Tại sao sự thay đổi này xảy ra?

  3. 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?


PostgreSQL 9.1: 1351746099.69961 MySQL (!!) 5.0: 1351746099 Có vẻ như bạn có vấn đề với phiên bản 8.4, không phải 9.2
Frank Heikens

Câu trả lời:


8

Thử nghiệm điều này trên máy của chính tôi, tôi nhận được 1351749699.69961 như là kết quả trên cả PostgreQuery 8.4.10 và 9.2.1.

Với PostgreQuery 8.4.10, kết quả thay đổi theo múi giờ của phiên. Với 9.2, thì không.

Có khả năng đây là tác động của sự thay đổi này: Đo kỷ nguyên của dấu thời gian-không có múi giờ từ địa phương không phải nửa đêm UTC. được ghi nhận là thay đổi tương thích 9.2.

Cách giải quyết được đề xuất trong ghi chú thay đổi là trước tiên chuyển dấu thời gian thành dấu thời gian: không chỉ thay đổi cấu hình.

Cá nhân, tôi thấy hành vi 9.2 thoải mái hơn. Kỷ nguyên Unix được định nghĩa là UTC, vì vậy điều này có nghĩa là các giá trị dấu thời gian đơn giản được hiểu là UTC: đó là cách tôi sử dụng chúng.

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.