2016-03-31 18 views
11

Tôi mới dùng PostgreSQL và tôi tự hỏi liệu có cách trực tiếp chỉ chuyển đổi giá trị dấu thời gian trong bảng thành múi giờ khác không bằng cách sử dụng hàm. Trong trường hợp của tôi, UTC là EST.Chuyển đổi múi giờ UTC trong postgresql thành EST (giờ địa phương)

Đây là những giá trị ví dụ mà tôi cần phải chuyển đổi để EST (không chỉ là một giá trị nhưng tất cả các giá trị trong bảng)

date 
------------------- 
2015-10-24 16:38:46 
2016-01-19 18:27:00 
2016-01-24 16:14:34 
2016-02-09 23:05:49 
2016-02-11 20:46:26 
+0

Side lưu ý: có thể bạn muốn sử dụng ' 'Mỹ/New_York'' (từ [cơ sở dữ liệu múi giờ IANA] (https://en.wikipedia.org/wiki/ Tz_database)) làm múi giờ của bạn, không phải là 'EST'. Chữ viết tắt ba chữ cái là không chính xác (bạn có thực sự có nghĩa là UTC-0400, hay bạn muốn UTC-0300 trong mùa hè?) Và thường lặp lại trên nhiều quốc gia, hoặc thậm chí ở một quốc gia (múi giờ cho cả Alaska và Puerto Rico) cả hai nhãn "AST") –

Trả lời

20

đây tại London, chúng tôi hiện là 1 giờ trước UTC. Vì vậy, nếu tôi lấy múi giờ của bạn mà không có dấu thời gian và nói nó là trong UTC tôi sẽ nhận được nó in cho múi giờ địa phương của tôi.

richardh=> SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC'); 
     timezone   
------------------------ 
2015-10-24 17:38:46+01 
(1 row) 

Nhưng bạn muốn "EST" có vẻ như ở đâu đó ở châu Mỹ, đánh giá bằng giá trị được trả lại. Bạn có thể bọc biểu thức trong một hàm SQL nhỏ nếu bạn muốn.

richardh=> SELECT ((timestamp '2015-10-24 16:38:46') AT TIME ZONE 'UTC') AT TIME ZONE 'EST'; 
     timezone  
--------------------- 
2015-10-24 11:38:46 
(1 row) 

Edit: làm thế nào để làm điều đó trong một truy vấn

SELECT ((stored_timestamp AT TIME ZONE 'UTC') AT TIME ZONE 'EST') AS local_timestamp 
FROM my_table; 

Bạn có thể sẽ muốn có được một cuốn sách giới thiệu về SQL nếu loại điều này đang gây ra những vấn đề bạn.

+0

Cảm ơn bạn rất nhiều. Nhưng, chức năng này chỉ dành cho một giá trị tem thời gian tùy chỉnh, đúng không? Làm thế nào để làm điều đó nếu tôi cần phải thay đổi tất cả các hàng trong một bảng, nhưng không chỉ là một giá trị? –

3

Tương tự thực hiện

SELECT '2015-10-24 16:38:46'::timestamp AT time zone 'EST'; 

timezone 
------------------------ 
2015-10-24 21:38:46+00 
(1 row) 
+0

Điều này có yêu cầu cơ sở dữ liệu của bạn phải được đặt để giả định UTC theo mặc định không? – benjimin

+0

benjimin Có. Bởi vì khi Postgres chạy lệnh này, nó sẽ chuyển đổi giá trị dấu thời gian thành EST nhưng sau đó hiển thị trong múi giờ đã đặt của bạn. Tương tự như phần đầu của câu trả lời của @Richard Huxton. Chúng chuyển đổi dấu thời gian thành 'UTC' nhưng nó được hiển thị là +01. –

Các vấn đề liên quan