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

Cách hoạt động của hàm timezone () trong PostgreSQL

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các bế tắc trong PostgreSQL khi chạy UPDATE

  2. Lời gọi hàm PostgreSQL

  3. Khắc phục “LỖI:mỗi truy vấn NGOẠI LỆ phải có cùng số cột” trong PostgreSQL

  4. Lỗi PostgreSQL:Fatal:tên người dùng vai trò không tồn tại

  5. Lỗi PostgreSQL:Đã tồn tại quan hệ