Mysql:将数据库从本地时间转换为UTC

Mysql:将数据库从本地时间转换为UTC,mysql,timezone,utc,unix-timestamp,Mysql,Timezone,Utc,Unix Timestamp,我需要从本地时间ut UTC转换现有(日期时间字段)db 这些值存储在时区为CET(+1)(夏季时间为+2)的服务器上的ad datetimes中。在选择数据时,我使用UNIX\u TIMESTAMP(),它神奇地补偿了一切,即时区偏移和dst(如果我正确阅读了文档的话) 我正在将数据库移动到一个新服务器上,使用UTC作为系统时间 简单地减去-1小时是行不通的,因为夏季是+2小时 有什么聪明的方法可以做到这一点吗?(使用sql或一些脚本语言)首先,您需要确保填充mysql.time\u zone

我需要从本地时间ut UTC转换现有(日期时间字段)db

这些值存储在时区为CET(+1)(夏季时间为+2)的服务器上的ad datetimes中。在选择数据时,我使用
UNIX\u TIMESTAMP()
,它神奇地补偿了一切,即时区偏移和dst(如果我正确阅读了文档的话)

我正在将数据库移动到一个新服务器上,使用UTC作为系统时间

简单地减去-1小时是行不通的,因为夏季是+2小时


有什么聪明的方法可以做到这一点吗?(使用sql或一些脚本语言)

首先,您需要确保填充mysql.time\u zone\u name表。如果为空,您可以按照此页面上的说明进行填充:

它通常非常简单,只需在shell中运行如下命令:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
填充该表后,可以使用CONVERT_TZ()函数更新数据库中的现有值:

下面是两个示例,说明它如何在冬季和夏季将日期时间从CET转换为UTC:

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)

需要注意的是,从一个时区到另一个时区或UTC的日期转换只能在日期为过去的情况下可靠地完成

时区定义会改变。它们是人类对如何偏离“太阳钟”的定义,这些定义可以而且确实在不断变化。因此,唯一有效的转换是过去的日期,因为这将不再改变

将来的任何日期都无法可靠地转换,因为转换只能考虑当前已知的时区定义

简单的例子:让我们明年在德国柏林创建一个会议预约。我们今天同意于2014年7月1日12:00在亚历山大广场会面。该日期将转换为当天的10:00 UTC

现在,如果一些政府决定在2014年退出夏令时,您将无法决定是在当地时间12:00还是11:00出现,因为从UTC转换回来将导致不同的当地时间


如果您已保存“2014-07-01 12:00 Europe/Berlin”的原始日期,您将与其他人一样在中午的确切时间到达那里。

在原始服务器中,您可以在更新查询中使用以下表达式之一:

CONVERT\u TZ(您的日期时间字段,'SYSTEM','UTC')
CONVERT\u TZ(您的\u datetime\u字段。@@global.time\u zone,'UTC')

或者,在目标服务器中,如果您知道原始服务器的时区(例如“欧洲/柏林”),则可以使用以下表达式之一:

CONVERT\u TZ(您的日期时间字段,'Europe/Berlin','UTC')

CONVERT_TZ(您的_datetime_字段,'Europe/Berlin',@@global.time_zone)

您好,我知道您已经有一段时间没有回答了,但由于某些原因,select语句对我不起作用……我检查了文档,我能够获得
select CONVERT_TZ('2004-01-01 12:00:00','+00:00',+10:00'),但不是您上面描述的…我缺少什么吗?我一直在为它设置null。@kalvish,您可能只需要填充mysql.time\u zone\u name表。尝试在shell中运行此命令来填充该表:
mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql-u root mysql
SELECT CONVERT_TZ('2017-02-15 08:00:00',“UTC”,“CST”);返回null@wyx
CST
在mysql.time\u zone\u name表中不是有效的命名时区。你是说美国/中央银行吗?如果是这样的话,这应该适用于您:
选择CONVERT_TZ('2017-02-15 08:00:00'、'UTC'、'US/Central')