2010-04-22 5 views
11

Tôi cần chuyển đổi db hiện tại (trường datetime) từ giờ địa phương ut UTC.Mysql: Chuyển đổi DB từ giờ địa phương sang UTC

Giá trị được lưu trữ thời gian biểu quảng cáo trên máy chủ có múi giờ CET (+1) (với giờ mùa hè +2). Khi lựa chọn dữ liệu tôi sử dụng UNIX_TIMESTAMP(), mà ma thuật bù đắp cho tất cả mọi thứ, tức là, thay đổi múi giờ và dst (nếu tôi đã đọc tài liệu đúng).

Tôi đang chuyển db sang máy chủ mới có UTC làm thời gian hệ thống.

Chỉ cần trừ -1 H sẽ không hoạt động, vì thời gian mùa hè là +2.

Bất kỳ ý tưởng nào về cách thông minh để thực hiện việc này? (sử dụng sql hoặc một số tập lệnh lang)

Trả lời

23

Trước tiên, bạn cần đảm bảo bảng mysql.time_zone_name được điền. Nếu đó là trống rỗng, bạn có thể làm theo hướng dẫn trên trang này để cư nó:

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

Nó thường đơn giản như chạy một lệnh như thế này trong vỏ:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql 

Khi bảng đó là dân cư bạn có thể sử dụng CONVERT_TZ() để cập nhật các giá trị tồn tại trong DB:

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz

Dưới đây là hai ví dụ để chứng tỏ nó chuyển đổi datetimes từ CET để UTC vào mùa đông vs mùa hè:

mysql> SELECT CONVERT_TZ('2010-01-22 12:00:00','CET','UTC'); 
+-----------------------------------------------+ 
| CONVERT_TZ('2010-01-22 12:00:00','CET','UTC') | 
+-----------------------------------------------+ 
| 2010-01-22 11:00:00       | 
+-----------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT CONVERT_TZ('2010-07-22 12:00:00','CET','UTC'); 
+-----------------------------------------------+ 
| CONVERT_TZ('2010-07-22 12:00:00','CET','UTC') | 
+-----------------------------------------------+ 
| 2010-07-22 10:00:00       | 
+-----------------------------------------------+ 
1 row in set (0.00 sec) 
+0

Xin chào, tôi biết đã một lúc kể từ khi bạn trả lời, nhưng vì lý do nào đó mà câu lệnh chọn không hoạt động đối với tôi ... Tôi đã kiểm tra tài liệu và tôi có thể nhận được 'SELECT CONVERT_TZ ('2004-01-01 12 : 00: 00 ',' + 00:00 ',' + 10:00 '); ', nhưng không phải những gì bạn mô tả ở trên ... có điều gì đó mà tôi đang thiếu không? Tôi tiếp tục nhận được null cho nó. – KVISH

+3

@ kalvish, bạn có thể chỉ cần điền bảng mysql.time_zone_name. Hãy thử chạy lệnh này trong trình bao để điền bảng đó: 'mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql -u root mysql' –

+0

SELECT CONVERT_TZ ('2017-02-15 08:00:00', "UTC", "CST"); return null – wyx

5

Cần lưu ý rằng việc chuyển đổi cho những ngày từ một múi giờ khác hoặc để UTC chỉ có thể được thực hiện đáng tin cậy nếu những ngày tháng trong quá khứ.

Định nghĩa múi giờ thay đổi. Họ là một định nghĩa của con người về làm thế nào để đi chệch khỏi "đồng hồ mặt trời", và những định nghĩa có thể và làm thay đổi liên tục. Vì vậy, chuyển đổi hợp lệ duy nhất là cho các ngày trong quá khứ, bởi vì điều đó sẽ không thay đổi nữa.

Bất kỳ ngày nào trong tương lai không thể được chuyển đổi một cách đáng tin cậy, vì chuyển đổi chỉ có thể tính đến định nghĩa múi giờ hiện đã biết.

Ví dụ đơn giản: Hãy tạo cuộc hẹn cuộc họp vào năm tới ở Berlin, Đức. Hôm nay, chúng tôi đồng ý rằng chúng tôi muốn gặp nhau vào lúc 12:00 ngày 1 tháng 7 năm 2014 tại Alexanderplatz. Ngày đó sẽ được dịch sang 10:00 UTC vào ngày đó.

Bây giờ nếu một số chính phủ quyết định từ chối tiết kiệm ánh sáng ban ngày trong năm 2014, bạn sẽ gặp sự cố khi quyết định xem bạn có nên xuất hiện lúc 12:00 giờ địa phương hay vào lúc 11:00 giờ địa phương hay không từ UTC sẽ dẫn đến giờ địa phương khác.

Nếu bạn đã lưu ngày gốc "2014-07-01 12:00 Châu Âu/Berlin", bạn sẽ có mặt tại thời điểm chính xác vào buổi trưa, như mọi người khác.

2

Trong máy chủ gốc, bạn có thể sử dụng một trong các khái niệm sau bên trong một truy vấn UPDATE:

CONVERT_TZ(your_datetime_field,'SYSTEM','UTC') CONVERT_TZ(your_datetime_field,@@global.time_zone,'UTC')

Ngoài ra, trong các máy chủ đích, nếu bạn biết múi giờ của máy chủ gốc (ví dụ 'Châu Âu/Berlin'), bạn có thể sử dụng một trong các khái niệm sau:

CONVERT_TZ(your_datetime_field,'Europe/Berlin','UTC') CONVERT_TZ(your_datetime_field,'Europe/Berlin',@@global.time_zone)