Mysql:将数据库从本地时间转换为UTC
我需要从本地时间ut UTC转换现有(日期时间字段)db 这些值存储在时区为CET(+1)(夏季时间为+2)的服务器上的ad datetimes中。在选择数据时,我使用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
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@wyxCST
在mysql.time\u zone\u name表中不是有效的命名时区。你是说美国/中央银行吗?如果是这样的话,这应该适用于您:选择CONVERT_TZ('2017-02-15 08:00:00'、'UTC'、'US/Central')代码>