Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL能否将存储的UTC时间转换为本地时区?_Mysql_Sql_Timezone_Convert Tz - Fatal编程技术网

MySQL能否将存储的UTC时间转换为本地时区?

MySQL能否将存储的UTC时间转换为本地时区?,mysql,sql,timezone,convert-tz,Mysql,Sql,Timezone,Convert Tz,MySQL能否在普通select语句中直接将存储的UTC时间转换为本地时间分区时间 假设您有一些时间戳为UTC的数据 CREATE TABLE `SomeDateTable` ( `id` int(11) NOT NULL auto_increment, `value` float NOT NULL default '0', `date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`id`

MySQL能否在普通select语句中直接将存储的UTC时间转换为本地时间分区时间

假设您有一些时间戳为UTC的数据

CREATE TABLE `SomeDateTable` (
  `id`    int(11) NOT NULL auto_increment,
  `value` float NOT NULL default '0',
  `date`  datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
)
然后当我

"select value, date from SomeDateTable";
当然,我会以存储的UTC格式获取所有日期

但是我想让他们在另一个时区和DST, 然后我可以给select查询添加一些魔力,以便将所有日期返回到所选时区吗

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable";
或者我必须在上面的其他层中执行此操作,比如在一些php代码中? 大多数人似乎就是这样解决这个问题的

如果您的MySQL安装允许您使用CONVERT_TZ,那么这是一个非常干净的解决方案, 这个例子展示了如何使用它

SELECT CONVERT_TZ( '2010-01-01 12:00', 'UTC', 'Europe/Stockholm' )

但是,我不知道这是否是一个好方法,因为一些MySQL安装缺少此函数,请小心使用。

是的,有此函数。

我不确定可以对日期时间数据类型进行什么计算,但如果您使用PHP,我强烈建议使用基于整数的时间戳。基本上,您可以使用PHP的时间函数在数据库中存储一个4字节的整数。这使得在它上面做数学变得更加简单。

我建议使用

SET time_zone = 'proper timezone';

在连接到数据库后立即执行一次。在此之后,所有时间戳将在选择它们时自动转换。

对于无法配置mysql环境的用户,例如,由于缺乏超级访问权限,无法使用美国/丹佛或格林威治标准时间等人性化时区名称,您也可以使用具有如下数字偏移的功能:

CONVERT_TZ(date,'+00:00','-07:00')
对于仅获取时间,请使用:

time(convert_tz(now(),@@session.time_zone,'+03:00'))
可以很容易地使用

CONVERT_TZ(your_timestamp_column_name, 'UTC', 'your_desired_timezone_name')
例如:

CONVERT_TZ(timeperiod, 'UTC', 'Asia/Karachi')
此外,这也可用于WHERE语句中,为了比较时间戳,我将在WHERE子句中使用以下内容:

WHERE CONVERT_TZ(timeperiod, 'UTC', '{$this->timezone}') NOT BETWEEN {$timeperiods['today_start']} AND {$timeperiods['today_end']}
1.正确设置服务器: 在服务器上,su到root并执行以下操作:

# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql
请注意,最后的命令当然是mysql,您将它发送到一个恰好具有相同名称的表:mysql

接下来,您可以使用ls/usr/share/zoneinfo

使用该命令可以查看ubuntu或几乎任何unixish服务器上的所有时区信息

顺便说一句,这是找到某个时区确切的官方名称的便捷方法

2.在mysql中,它是微不足道的: 比如说

mysql> select ts, CONVERT_TZ(ts, 'UTC', 'Pacific/Tahiti') from example_table ;
+---------------------+-----------------------------------------+
| ts                  | CONVERT_TZ(ts, 'UTC', 'Pacific/Tahiti') |
+---------------------+-----------------------------------------+
| 2020-10-20 16:59:57 | 2020-10-20 06:59:57                     |
| 2020-10-20 17:02:59 | 2020-10-20 07:02:59                     |
| 2020-10-20 17:30:08 | 2020-10-20 07:30:08                     |
| 2020-10-20 18:36:29 | 2020-10-20 08:36:29                     |
| 2020-10-20 18:37:20 | 2020-10-20 08:37:20                     |
| 2020-10-20 18:37:20 | 2020-10-20 08:37:20                     |
| 2020-10-20 19:00:18 | 2020-10-20 09:00:18                     |
+---------------------+-----------------------------------------+

似乎是正确的,但我直接遇到了这个错误:我的服务器缺少时区数据…mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql-u root mysqlconvert_tz是我问题的答案,但也许我还是会使用php来解决这个问题。。。因为我的站点所在的服务器也丢失了时区数据,所以我无法修复它…需要注意的是,这不会自动转换日期、时间和日期时间字段。这将只对时间戳字段进行自动转换,并影响NOW和CURDATE函数的结果。如果您希望这是永久性的,还可以更改时区参数。如果该时区具有夏令时,则此操作将不起作用,因为您将具有不同的偏移量sommer和winter,还有一些30分钟DST的例子…很有趣。。在我的例子中,我必须从PHP运行一些查询,不想在PHP中对结果进行任何TZ处理,但我可以很容易地更改select查询中的数值。感谢当我在mysql中执行WHERE CONVERT_TZ查询时,它执行了整个表扫描,尽管我使用了索引列作为“时间段”,绝对时间戳值作为“开始和结束之间”。我已经读到,在“WHERE”或“HAVING”子句中使用列函数通常不是一个好主意。你可能是对的,但另一方面,如果你在WHERE类中不使用列函数,那么我们将如何比较值呢?很好,对于这一点,我唯一的建议是非常小心WHERE子句,以最小化/减轻表空间扫描。在这方面,按“时间段”对表进行分区可能会有所帮助。或者,服务器端语言可以用来进行时区转换,但这可能超出了OP的问题范围。
mysql> select ts, CONVERT_TZ(ts, 'UTC', 'Pacific/Tahiti') from example_table ;
+---------------------+-----------------------------------------+
| ts                  | CONVERT_TZ(ts, 'UTC', 'Pacific/Tahiti') |
+---------------------+-----------------------------------------+
| 2020-10-20 16:59:57 | 2020-10-20 06:59:57                     |
| 2020-10-20 17:02:59 | 2020-10-20 07:02:59                     |
| 2020-10-20 17:30:08 | 2020-10-20 07:30:08                     |
| 2020-10-20 18:36:29 | 2020-10-20 08:36:29                     |
| 2020-10-20 18:37:20 | 2020-10-20 08:37:20                     |
| 2020-10-20 18:37:20 | 2020-10-20 08:37:20                     |
| 2020-10-20 19:00:18 | 2020-10-20 09:00:18                     |
+---------------------+-----------------------------------------+