Trong PostgreSQL, bạn có thể sử dụng timezone()
chức năng chuyển đổi dấu thời gian sang múi giờ khác.
Cú pháp
Cú pháp như sau:
timezone(zone, timestamp)
Nơi zone
là múi giờ bạn muốn timestamp
đối số được chuyển đổi thành.
Kết quả bạn nhận được sẽ phụ thuộc vào việc giá trị dấu thời gian ban đầu có bao gồm múi giờ hay không (và giá trị đó là gì).
Ví dụ 1 -Khi Dấu thời gian gốc KHÔNG bao gồm múi giờ
Đây là những gì sẽ xảy ra khi dấu thời gian gốc bao gồm múi giờ.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+00');
Kết quả:
2020-10-25 04:00:00
Khi dấu thời gian gốc bao gồm múi giờ, thì timezone()
hàm chuyển giá trị dấu thời gian ban đầu sang múi giờ được chỉ định và trả về giá trị không có múi giờ.
Đây là điều sẽ xảy ra nếu tôi thay đổi múi giờ của dấu thời gian đầu vào.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00+01');
Kết quả:
2020-10-25 03: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 đó giá trị dấu thời gian ban đầu được chuyển sang múi giờ địa phương.
SELECT timezone('Indian/Mauritius', timestamp with time zone '2020-10-25 00:00:00');
Kết quả:
2020-10-24 18:00:00
Trong trường hợp này, dấu thời gian kết quả đã lùi lại sáu giờ. Điều này có nghĩa là múi giờ địa phương của tôi trước Indian / Mauritius sáu 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 '2020-10-25 00:00:00';
Kết quả:
2020-10-25 00:00:00+10
Ví dụ 2 - Khi Dấu thời gian gốc KHÔNG bao gồm múi giờ
Đây là những gì sẽ xảy ra khi dấu thời gian ban đầu không bao gồm múi giờ.
SELECT timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00');
Kết quả:
2020-10-25 06: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 timezone('Indian/Mauritius', timestamp without time zone '2020-10-25 00:00:00+12');
Kết quả:
2020-10-25 06: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 '2020-10-25 00:00:00+12';
Kết quả:
2020-10-25 00:00:00
Ví dụ 3 - localtimestamp
Hãy sử dụng localtimestamp
hàm để chạy so sánh giữa dấu thời gian hiện tại trong múi giờ của riêng tôi và dấu thời gian kết quả sau khi sử dụng timezone()
chức năng chuyển đổi nó sang một múi giờ khác.
\x
SELECT
localtimestamp,
timezone('Indian/Mauritius', localtimestamp);
Kết quả:
localtimestamp | 2020-07-08 15:42:04.965221 timezone | 2020-07-08 21:42:04.965221+10
localtimestamp
hàm trả về dấu thời gian kiểu dữ liệu, đi kèm với "không có múi giờ" ngầm. Nói cách khác, dấu thời gian và dấu thời gian không có múi giờ đều giống nhau.
Như đã trình bày trước đây, khi không có múi giờ nào được chỉ định trong dấu thời gian gốc, thì TimeZone
hiện tại cài đặt được sử dụng và thêm vào kết quả. Và đó là những gì chúng tôi nhận được khi sử dụng localtimestamp
.
Nhân tiện, trong ví dụ này, tôi đã sử dụng \x
để hiển thị kết quả bằng cách sử dụng màn hình mở rộng / đầu ra dọc, chỉ để dễ đọc hơn.
Ví dụ 4 - current_timestamp
Bây giờ hãy sử dụng current_timestamp
hàm thay vì localtimestamp
.
SELECT
current_timestamp,
timezone('Indian/Mauritius', current_timestamp);
Kết quả (sử dụng đầu ra dọc):
current_timestamp | 2020-07-08 15:42:04.335669+10 timezone | 2020-07-08 09:42:04.335669
Lần này chênh lệch múi giờ đã được thêm vào dấu thời gian ban đầu và timezone()
kết quả không còn bao gồm nó nữa.
Chúng tôi nhận được kết quả này vì current_timestamp
hàm trả về dấu thời gian với múi giờ kiểu dữ liệu.
Ví dụ 5 - Sử dụng Giá trị thời gian
timezone()
hàm cũng hoạt động với time
giá trị (time with time zone
và time without time zone
).
Tuy nhiên, khi sử dụng nó vào time with time zone
giá trị, chênh lệch múi giờ được thêm vào kết quả.
SELECT
timezone('Indian/Mauritius', time with time zone '00:00:00+00'),
timezone('Indian/Mauritius', time with time zone '00:00:00+01'),
timezone('Indian/Mauritius', time with time zone '00:00:00');
Kết quả (sử dụng đầu ra dọc):
múi giờtimezone | 04:00:00+04 timezone | 03:00:00+04 timezone | 18:00:00+04
Và để đầy đủ, đây là những giá trị tương tự sử dụng time without time zone
kiểu dữ liệu.
SELECT
timezone('Indian/Mauritius', time without time zone '00:00:00+00'),
timezone('Indian/Mauritius', time without time zone '00:00:00+01'),
timezone('Indian/Mauritius', time without time zone '00:00:00');
Kết quả (sử dụng đầu ra dọc):
múi giờtimezone | 18:00:00+04 timezone | 18:00:00+04 timezone | 18:00:00+04
Kiểm tra múi giờ địa phương
Nếu bạn muốn kiểm tra múi giờ địa phương của mình, hãy chạy SHOW TIMEZONE
.
Đây là những gì tôi nhận được khi chạy lệnh đó.
SHOW TIMEZONE;
Kết quả:
Australia/Brisbane
Kiểm tra Chênh lệch múi giờ
Được trang bị kiến thức ở trên, giờ đây tôi có thể kiểm tra chênh lệch hai múi giờ bằng cách truy vấn pg_timezone_names
xem.
SELECT *
FROM pg_timezone_names
WHERE name = 'Indian/Mauritius'
OR name = 'Australia/Brisbane';
Kết quả (sử dụng đầu ra dọc):
name | abbrev | utc_offset | is_dst --------------------+--------+------------+-------- Indian/Mauritius | +04 | 04:00:00 | f Australia/Brisbane | AEST | 10:00:00 | f
Xem Trả lại danh sách múi giờ được PostgreSQL hỗ trợ để biết thêm tùy chọn và ví dụ về việc trả lại múi giờ trong Postgres.