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

Cách AT TIME ZONE hoạt động trong PostgreSQL

Trong PostgreSQL, bạn có thể sử dụng AT TIME ZONE mệnh đề chuyển đổi dấu thời gian sang múi giờ khác.

Cú pháp

Bạn có thể sử dụng nó với bất kỳ biến thể nào trong ba biến thể sau:

timestamp with time zone AT TIME ZONE zone
timestamp without time zone AT TIME ZONE zone
time with time zone AT TIME ZONE zone

Nơi zone là múi giờ mà bạn muốn chuyển đổi giá trị ở bên trái.

Nói rõ hơn, sự khác biệt duy nhất giữa ba biến thể là ở loại dữ liệu của dấu thời gian sẽ được chuyển đổi.

Ba kiểu dữ liệu là:

  • timestamp with time zone
  • timestamp without time zone
  • time with time zone

Kết quả bạn nhận được sẽ phụ thuộc vào kiểu dữ liệu.

Bảng sau đây phác thảo kết quả mà mỗi biến thể tạo ra.

Biểu thức Loại trả lại Mô tả
timestamp with time zone AT TIME ZONE zone timestamp without time zone Chuyển đổi tem thời gian nhất định với múi giờ sang múi giờ mới, không có chỉ định múi giờ
timestamp without time zone AT TIME ZONE zone timestamp with time zone Xử lý dấu thời gian nhất định không có múi giờ như nằm trong múi giờ được chỉ định
time with time zone AT TIME ZONE zone time with time zone Chuyển đổi thời gian nhất định theo múi giờ sang múi giờ mới

Biến thể 1

Đây là những gì sẽ xảy ra khi bạn chuyển đổi timestamp with time zone giá trị.

SELECT timestamp with time zone '2025-11-20 00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Kết quả:

2025-11-20 02:00:00

Khi dấu thời gian ban đầu là timestamp with time zone giá trị, nó được chuyển sang múi giờ được chỉ định và kết quả được trả về mà không có chênh lệch múi giờ.

Đây là điều sẽ xảy ra nếu tôi thay đổi độ lệch múi giờ của giá trị đầu vào.

SELECT timestamp with time zone '2025-11-20 00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Kết quả:

2025-11-20 01:00:00

Dấu thời gian kết quả được thay đổi theo múi giờ đầu vào.

Và nếu bạn chỉ định timestamp with time zone , nhưng dấu thời gian ban đầu không thực sự bao gồm múi giờ, khi đó múi giờ địa phương được giả định.

SELECT timestamp with time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Kết quả:

2025-11-19 16:00:00

Trong trường hợp này, dấu thời gian kết quả đã lùi lại tám giờ. Điều này có nghĩa là múi giờ địa phương của tôi đi trước Châu Phi / Cairo tám giờ.

Chúng tôi có thể xem độ lệch múi giờ đã được sử dụng bằng cách chọn trực tiếp giá trị đầu vào.

SELECT timestamp with time zone '2025-11-20 00:00:00';

Kết quả:

2025-11-20 00:00:00+10

Biến thể 2

Dưới đây là những gì sẽ xảy ra khi dấu thời gian gốc sử dụng timestamp without time zone giá trị.

Nói cách khác, nó không bao gồm múi giờ.

SELECT timestamp without time zone '2025-11-20 00:00:00' AT TIME ZONE 'Africa/Cairo';

Kết quả:

2025-11-20 08:00:00+10

Khi dấu thời gian ban đầu không bao gồm múi giờ, kết quả được hiển thị bằng TimeZone hiện tại cài đặt và độ lệch múi giờ được thêm vào.

Điều này áp dụng bất kỳ lúc nào bạn chỉ định timestamp without time zone , ngay cả khi trên thực tế, dấu thời gian có chứa chênh lệch múi giờ.

SELECT timestamp without time zone '2025-11-20 00:00:00+12' AT TIME ZONE 'Africa/Cairo';

Kết quả:

2025-11-20 08:00:00+10

Điều này được mong đợi, bởi vì nếu tôi chỉ chọn timestamp without time zone giá trị, đây là những gì tôi nhận được:

SELECT timestamp without time zone '2025-11-20 00:00:00+12';

Kết quả:

2025-11-20 00:00:00

Biến thể 3

Đây là điều xảy ra khi dấu thời gian gốc sử dụng time with time zone giá trị.

SELECT time with time zone '00:00:00+00' AT TIME ZONE 'Africa/Cairo';

Kết quả:

02:00:00+02

Nó chuyển đổi time with time zone giá trị cho múi giờ mới và thêm độ lệch múi giờ vào kết quả.

Đây là điều sẽ xảy ra nếu tôi thay đổi độ lệch múi giờ của giá trị đầu vào.

SELECT time with time zone '00:00:00+01' AT TIME ZONE 'Africa/Cairo';

Kết quả:

01:00:00+02

Dấu thời gian kết quả được thay đổi theo múi giờ đầu vào.

Và nếu bạn chỉ định time with time zone , nhưng dấu thời gian ban đầu không thực sự bao gồm múi giờ, múi giờ địa phương được giả định.

SELECT time with time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Kết quả:

16:00:00+02

Trong trường hợp này, dấu thời gian kết quả đã bị lùi lại tám giờ (vì múi giờ địa phương của tôi đi trước Châu Phi / Cairo tám giờ).

Chúng tôi có thể thấy độ lệch múi giờ đã được sử dụng bằng cách chọn trực tiếp giá trị đầu vào.

SELECT time with time zone '00:00:00';

Kết quả:

00:00:00+10

Thời gian không có múi giờ

Mặc dù tài liệu Postgres không bao gồm time without time zone biến thể, dù sao đây cũng là một ví dụ.

SELECT time without time zone '00:00:00' AT TIME ZONE 'Africa/Cairo';

Kết quả:

16:00:00+02

Vì vậy, trong ví dụ này, múi giờ địa phương được giả định cho múi giờ được chuyển đổi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dấu hai chấm (::) ký hiệu trong SQL

  2. Tổng quan về Serial Pseudo-Datatype cho PostgreSQL

  3. Quản lý và tự động hóa PostgreSQL với ClusterControl

  4. PostgreSQL:ERROR:42601:cần có danh sách định nghĩa cột cho các hàm trả về bản ghi

  5. Rails và PostgreSQL:Postgres vai trò không tồn tại