2010-01-21 38 views
32

Ứng dụng web của tôi lưu trữ tất cả dấu thời gian trong UTC mà không có múi giờ. Tôi có một kịch bản shell/psql trả về một danh sách các thông tin đăng nhập gần đây, và tôi muốn kịch bản đó hiển thị thời gian đăng nhập trong múi giờ địa phương của máy chủ (có thể thay đổi tùy thuộc vào nơi máy chủ đang ở và tiết kiệm ánh sáng ban ngày).Bù giờ múi giờ địa phương trong PostgreSQL

Để có được một khoảng thời gian đại diện cho sự khác biệt giữa các múi giờ máy chủ cơ sở dữ liệu của tôi và UTC, Tôi hiện đang sử dụng hack này:

SELECT age(now() at time zone 'UTC', now()); 

đó làm việc, nhưng là có một cách đơn giản hơn?

Có tham số cấu hình máy chủ được gọi là "múi giờ" trả về chuỗi múi giờ hợp lệ, nhưng tôi không nghĩ rằng có thể truy cập các tham số đó trong truy vấn. (Tôi đoán đó là một câu hỏi riêng, nhưng một câu trả lời cho nó sẽ giải quyết vấn đề múi giờ.)

+0

Cảm ơn cho câu hỏi. Tôi đã thêm một đoạn giải thích lý do tại sao tôi muốn có sự khác biệt. – TimH

Trả lời

51
SELECT current_setting('TIMEZONE') 

Điều này có thể được sử dụng trong truy vấn, tuy nhiên, điều này không mang lại sự khác biệt về số.

Giải pháp của bạn là tốt.

+0

Cảm ơn, đó là những gì tôi cần biết. Điều này sẽ hoạt động: SELECT some_table.utc_timestamp tại múi giờ current_setting ('TIMEZONE'); Và điều đó rõ ràng hơn rất nhiều đối với ai đó đang đọc mã so với bản hack của tôi. – TimH

+0

Nhược điểm duy nhất của điều này là nó có thể tạo ra một bù đắp như '-05: 00', một tên múi giờ đầy đủ chiều dài như 'Australia/Perth', hoặc thậm chí một từ viết tắt có khả năng mơ hồ như 'EST'. –

+1

@CraigRinger: mọi thứ được trả về bởi 'CURRENT_SETTING ('múi giờ')' có thể được cấp cho 'AT TIME ZONE' mà không gặp vấn đề gì. – Quassnoi

5

Để có đượC# giây khác biệt là một số nguyên, tôi đã sử dụng đơn giản:

select extract(timezone from now()); 
Các vấn đề liên quan