Đối với múi giờ bạn có thể:
SHOW timezone;
hoặc tương đương:
SELECT current_setting('TIMEZONE');
nhưng điều này có thể ở bất kỳ định dạng nào được máy chủ chấp nhận, vì vậy nó có thể trả về UTC
, 08:00
, Australia/Victoria
, hoặc tương tự.
Thật thất vọng, dường như không có chức năng tích hợp nào để báo cáo thời gian bù trừ theo giờ UTC mà khách hàng đang sử dụng theo giờ và phút, điều này có vẻ hơi điên rồ đối với tôi. Bạn có thể nhận được sự bù đắp bằng cách so sánh thời gian hiện tại ở UTC với thời gian hiện tại tại địa phương:
SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`
... nhưng IMO sẽ dễ dàng hơn khi trích xuất độ lệch tz trong vài giây từ current_timestamp
và chuyển đổi thành khoảng thời gian:
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
Điều đó sẽ khớp với kết quả mong muốn ngoại trừ việc nó không tạo ra số 0 ở đầu, vì vậy -05:00
chỉ là -5:00
. Thật khó chịu, dường như không thể lấy được to_char
để tạo ra số 0 ở đầu trong nhiều giờ, để lại cho tôi định dạng thủ công xấu xí sau:
CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone_hour FROM current_timestamp),'FM00')||':'||
to_char(extract(timezone_minute FROM current_timestamp),'FM00');
$$ LANGUAGE 'SQL' STABLE;
Ghi có cho Glenn cho timezone_hour
và timezone_minute
thay vì hack mà tôi đã sử dụng trước đó với extract(timezone from current_timestamp) * INTERVAL '1' second)
và một CTE.
Nếu bạn không cần số 0 ở đầu, bạn có thể sử dụng:
CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
$$ LANGUAGE 'SQL' STABLE;
Xem thêm:
- Chênh lệch múi giờ địa phương trong PostgreSQL
- Cách biết múi giờ của dấu thời gian trong postgresql 8.3