Làm cách nào để lấy tên múi giờ hiện tại trong Postgres 9.3?


81

Tôi muốn lấy tên múi giờ hiện tại. Những gì tôi đã đạt được là nhận được utc_offset/ viết tắt múi giờ thông qua:

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')

Điều này cung cấp cho tôi tất cả các kết hợp Lục địa / Hoa cho múi giờ này nhưng không phải là chính xác timezone. Ví dụ tôi nhận được:

Europe/Amsterdam
Europe/Berlin

Máy chủ đang ở trong Berlinvà tôi muốn lấy tên múi giờ của máy chủ.

Vấn đề tôi gặp phải với CETnó luôn luôn UTC+01:00và không tính đến DST iirc.


Tên múi giờ thích hợp của Berlin và Amsterdam là Giờ Trung Âu (CET). Nói chung, tên múi giờ và chữ viết tắt không được xác định rõ ràng; trong khi có tiêu chuẩn ISO, nhiều quốc gia sử dụng định nghĩa riêng của họ. Hỗ trợ PostgreSQL cũng không hoàn chỉnh, hãy xem postgresql.org/docs/9.4/static/datetime-config-files.html để biết một số chi tiết.
Patrick

1
Trong bảng pg_timezone_names, CET được định nghĩa là chữ viết tắt và ví dụ: "Europe / Berlin" là tên. Tôi cần tên chứ không phải viết tắt.
Deutro

Liên kết mà tôi đã đưa ra trong nhận xét trước đây của tôi cho bạn thấy cách bạn có thể chỉnh sửa các tệp để cung cấp những gì bạn cần. Đó là tốt như nó nhận được.
Patrick

Vì vậy, không có cách nào để bưu tá cho tôi biết tôi đang ở "Châu Âu / Berlin" hoặc "Châu Âu / Amsterdam" chỉ là tôi đang ở múi giờ CET?
Deutro

Bạn có thể chỉnh sửa câu hỏi của mình và định nghĩa "Tôi tham gia" không? Máy chủ (thường) ở một vị trí cố định và múi giờ được lấy từ hệ điều hành hoặc tệp cấu hình. Tên tz được cố định như máy chủ. Vậy bạn có thực sự muốn tên múi giờ của máy chủ hoặc của dữ liệu trong cơ sở dữ liệu không?
Patrick

Câu trả lời:


119

Tôi không nghĩ rằng điều này là khả thi khi sử dụng PostgreSQL một mình trong trường hợp chung nhất. Khi bạn cài đặt PostgreSQL, bạn chọn một múi giờ. Tôi khá chắc chắn rằng mặc định là sử dụng múi giờ của hệ điều hành. Điều đó thường sẽ được phản ánh trong postgresql.conf dưới dạng giá trị của tham số "múi giờ". Nhưng giá trị cuối cùng là "localtime". Bạn có thể thấy cài đặt này với câu lệnh SQL.

show timezone;

Nhưng nếu bạn thay đổi múi giờ trong postgresql.conf một cái gì đó giống như "Châu Âu / Berlin", sau đó show timezone;sẽ trở lại giá trị thay vì "localtime".

Vì vậy, tôi nghĩ rằng giải pháp của bạn sẽ liên quan đến việc đặt "múi giờ" trong postgresql.conf thành một giá trị rõ ràng thay vì "localtime" mặc định.


Cảm ơn câu trả lời của bạn. Kỳ lạ là không thể lấy múi giờ Hệ thống.
Deutro

3
Và để đặt múi giờ bạn có thể sử dụng set timezone to 'UTC'.
ivkremer 15/09/17

@ivkremer: set timezoneđặt múi giờ cho một phiên khách hàng; nó không đặt múi giờ cho máy chủ PostgreSQL.
Mike Sherrill 'Cat Recall'

@ MikeSherrill'CatRecall 'cảm ơn bạn, tôi đã không kiểm tra nó.
ivkremer

25

Điều này có thể hoặc không thể giúp bạn giải quyết vấn đề của mình, OP, nhưng để nhận múi giờ của máy chủ hiện tại so với UTC ( UT1 , về mặt kỹ thuật), hãy làm:

SELECT EXTRACT(TIMEZONE FROM now())/3600.0;

Ở trên hoạt động bằng cách trích xuất độ lệch tương đối UT1 trong vài phút, sau đó chuyển đổi nó thành giờ bằng cách sử dụng hệ số 3600 giây / giờ.

Thí dụ:

SET SESSION timezone TO 'Asia/Kabul';
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
-- output: 4.5 (as of the writing of this post)

( tài liệu ).


6
Một người dùng khác đã đề xuất sử dụng SELECT EXTRACT(TIMEZONE_HOUR FROM now()), nhưng điều này hơi nguy hiểm vì nó bỏ qua thực tế là có cả múi giờ nửa và phần tư . @giladMayani
koyae

2
"Triều Tiên, Newfoundland, Ấn Độ, Iran, Afghanistan, Venezuela, Miến Điện, Sri Lanka, Marquesas, cũng như các vùng của Úc sử dụng độ lệch nửa giờ so với giờ chuẩn. Một số quốc gia, chẳng hạn như Nepal và một số tỉnh, chẳng hạn như Quần đảo Chatham, sử dụng độ lệch 1/4 giờ. " ( liên kết )
koyae

21

Nó có vẻ hoạt động tốt trong Postgresql 9.5 :

SELECT current_setting('TIMEZONE');

Tôi đã chạy lệnh của bạn và nó đã trả lại cho tôi 15.200 hàng, mặc dù tất cả chúng đều có cùng múi giờ.
Subhendu Mahanta

9

Xem câu trả lời này: Nguồn

Nếu múi giờ không được chỉ định trong postgresql.conf hoặc là một tùy chọn dòng lệnh của máy chủ, thì máy chủ sẽ cố gắng sử dụng giá trị của biến môi trường TZ làm múi giờ mặc định. Nếu TZ không được xác định hoặc không phải là bất kỳ tên múi giờ nào mà PostgreSQL biết, máy chủ sẽ cố gắng xác định múi giờ mặc định của hệ điều hành bằng cách kiểm tra hoạt động của hàm thư viện C localtime (). Múi giờ mặc định được chọn làm đối sánh gần nhất trong số các múi giờ đã biết của PostgreSQL. (Những quy định này cũng được sử dụng để lựa chọn các giá trị mặc định của log_timezone, nếu không quy định.) Nguồn

Điều này có nghĩa là nếu bạn không xác định múi giờ, máy chủ sẽ cố gắng xác định múi giờ mặc định của hệ điều hành bằng cách kiểm tra hoạt động của hàm thư viện C localtime ().

Nếu múi giờ không được chỉ định trong postgresql.conf hoặc là một tùy chọn dòng lệnh của máy chủ, thì máy chủ sẽ cố gắng sử dụng giá trị của biến môi trường TZ làm múi giờ mặc định.

Có vẻ như có múi giờ của Hệ thống được đặt thực sự có thể.

Lấy múi giờ địa phương của hệ điều hành từ shell. Trong psql:

=> \! date +%Z

2
date +%Zlệnh sẽ trở lại múi giờ của khách hàng, chứ không phải máy chủ của bạn đã kết nối quapsql
Eugen Konkov

8

Bạn có thể truy cập múi giờ bằng đoạn mã sau:

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • current_setting ('TIMEZONE') sẽ cung cấp cho bạn thông tin Châu lục / Thủ đô của cài đặt
  • pg_timezone_names Chế độ xem pg_timezone_names cung cấp danh sách các tên múi giờ được SET TIMEZONE nhận dạng, cùng với các chữ viết tắt có liên quan, hiệu số UTC và trạng thái tiết kiệm ánh sáng ban ngày.
  • cột tên trong chế độ xem (pg_timezone_names) là tên múi giờ.

đầu ra sẽ là:

name- Europe/Berlin, 
abbrev - CET, 
utc_offset- 01:00:00, 
is_dst- false
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.