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

Tên múi giờ có các thuộc tính giống hệt nhau mang lại kết quả khác khi áp dụng cho dấu thời gian

Ngay sau khi tôi đăng bài này, tôi đã chạy một truy vấn khác để kiểm tra xem có nghi ngờ không:

SELECT * FROM pg_timezone_abbrevs
WHERE  abbrev IN ('CEST', 'CET');

 abbrev | utc_offset | is_dst
--------+------------+--------
 CEST   | 02:00:00   | t
 CET    | 01:00:00   | f

Hóa ra, có cũng múi giờ viết tắt được đặt tên là CET (có lý, "CET" là một từ viết tắt). Và có vẻ như PostgreSQL chọn tên viết tắt thay vì tên đầy đủ. Vì vậy, mặc dù tôi đã tìm thấy CET trong múi giờ tên , cụm từ '2012-01-18 1:0 CET' ::timestamptz được diễn giải theo các quy tắc khác nhau một cách tinh tế cho các chữ viết tắt của múi giờ .

SELECT '2012-01-18 1:0 CEST'::timestamptz(0)
      ,'2012-01-18 1:0 CET'::timestamptz(0)
      ,'2012-01-18 1:0 Europe/Vienna'::timestamptz(0);

      timestamptz       |      timestamptz       |      timestamptz
------------------------+------------------------+------------------------
 2012-01-18 00:00:00+01 | 2012-01-18 01:00:00+01 | 2012-01-18 01:00:00+01


SELECT '2012-08-18 1:0 CEST'::timestamptz(0)
      ,'2012-08-18 1:0 CET'::timestamptz(0)
      ,'2012-08-18 1:0 Europe/Vienna'::timestamptz(0);

      timestamptz       |      timestamptz       |      timestamptz
------------------------+------------------------+------------------------
 2012-08-18 01:00:00+02 | 2012-08-18 02:00:00+02 | 2012-08-18 01:00:00+02

Tôi tìm thấy 10 trường hợp của múi giờ viết tắt trong múi giờ tên và không hiểu tại sao chúng lại ở đó. Mục đích là gì?

Trong số đó, chênh lệch thời gian (utc_offset ) không đồng ý trong bốn trường hợp do cài đặt DST:

SELECT n.*, a.*
FROM   pg_timezone_names n 
JOIN   pg_timezone_abbrevs a ON  a.abbrev = n.name
WHERE  n.utc_offset <> a.utc_offset;

 name | abbrev | utc_offset | is_dst | abbrev | utc_offset | is_dst
------+--------+------------+--------+--------+------------+--------
 CET  | CEST   | 02:00:00   | t      | CET    | 01:00:00   | f
 EET  | EEST   | 03:00:00   | t      | EET    | 02:00:00   | f
 MET  | MEST   | 02:00:00   | t      | MET    | 01:00:00   | f
 WET  | WEST   | 01:00:00   | t      | WET    | 00:00:00   | f

Trong những trường hợp này, mọi người có thể bị lừa (như tôi đã từng), khi tra cứu tz name và tìm khoảng thời gian bù đắp không thực sự được áp dụng. Đó là một thiết kế đáng tiếc - nếu không phải là lỗi, thì ít nhất là lỗi tài liệu .

Tôi không tìm thấy bất kỳ điều gì trong sách hướng dẫn về mức độ không rõ ràng giữa các tên múi giờ và chữ viết tắt được giải quyết. Rõ ràng là chữ viết tắt được ưu tiên hơn.

Phụ lục B.1. Phiên dịch nhập ngày / giờ đề cập đến việc tra cứu các từ viết tắt của múi giờ, nhưng vẫn không rõ ràng múi giờ cách tên được xác định và cái nào trong số chúng có mức độ ưu tiên trong trường hợp mã thông báo không rõ ràng.

Nếu mã thông báo là một chuỗi văn bản, hãy khớp với các chuỗi có thể có:

Thực hiện tra cứu bảng tìm kiếm nhị phân để tìm mã thông báo dưới dạng viết tắt của múi giờ.

Chà, có một gợi ý nhỏ trong câu này rằng các chữ viết tắt đứng trước, nhưng không có gì dứt khoát. Ngoài ra, có một cột abbrev trong cả hai bảng, pg_timezone_namespg_timezone_abbrevs ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tự động hóa các công việc hàng ngày của PostgreSQL bằng Jenkins

  2. Sắp xếp các giá trị NULL vào cuối bảng

  3. Có phải thiết kế tồi khi sử dụng các mảng trong cơ sở dữ liệu không?

  4. Tên bảng động truy vấn SQL trong FOR

  5. Làm cách nào để lấy dữ liệu cục bộ vào cơ sở dữ liệu chỉ đọc bằng dplyr?