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