2013-08-12 18 views
5

Tôi cần chuyển đổi giờ địa phương sang UTC bằng cách sử dụng chức năng. Các yếu tố đầu vào tôi có là giờ địa phương, múi giờ của giờ địa phương (ví dụ: 'Thái Bình Dương/Auckland'). Những gì tôi cần để có được từ các thủ tục là thời gian UTC cho thời gian địa phương dựa trên múi giờ nhất định.Làm thế nào để chuyển đổi giờ địa phương thành UTC?

Ai đó có thể giúp bạn không?

Tôi đang sử dụng phiên bản 8.3

+1

http://www.postgresql.org/docs/8.3/static/functions-datetime.html#FUNCTIONS-DATETIME-ZONECONVERT – AdamKG

Trả lời

16

này được bao phủ trong manual, nhưng nó không phải luôn luôn rõ ràng làm thế nào để thực sự làm việc với các ngày/lần. Thông số SQL là một chút kỳ quái.

Trong trường hợp câu hỏi của bạn không rõ liệu bạn có muốn lưu trữ thời gian trong UTC hay không hiển thị thời gian địa phương của máy chủ (TimeZone) hoặc bạn có thể bỏ qua TimeZone và luôn hiển thị dưới dạng UTC hay không. Tôi sẽ giả định sau.

Đối với timestamps bạn muốn chỉ cần sử dụng AT TIME ZONE hai lần, như:

SELECT TIMESTAMP '2013-08-13 00:00:00' AT TIME ZONE 'Australia/Sydney' AT TIME ZONE 'UTC'; 

Bạn cần phải sử dụng AT TIME ZONE hai lần. Một lần để chuyển đổi đầu vào timestamp thành timestamptz theo múi giờ đối số, sau đó một chuyển đổi thành số timestamp tại UTC.

Thật không may vì cách (IMO điên) thông số SQL xác định AT TIME ZONE cho TIME, bạn không thể làm tương tự cho TIME. Bạn sẽ phải thao tác các biến TimeZone thay vì:

SET TimeZone = 'UTC'; 
SELECT TIME '07:00' AT TIME ZONE 'Australia/Sydney'; 

này vẫn để lại cho bạn một không timetz một time. Vì vậy, giá trị hiển thị của nó thay đổi với cài đặt timezone.

+0

+1 cho TimeZone đã đặt, đây là phần tôi bị thiếu khi cố chuyển đổi dấu thời gian không có múi giờ để utc timestampstz's. Cảm ơn! – grinch