【问题标题】:MySQL Timezone QueryMySQL 时区查询
【发布时间】:2012-10-23 07:11:24
【问题描述】:

我有两个字段:time_scan_starttime_scan_end(时间戳字段)。

当我使用 PDO 打开与 MySQL 的连接时,我使用 SET NAMES utf8,time_zone = "+0:00";

现在,当我在 MySQL 中进行查询时,我必须使用 UTC 时间WHERE time_scan_start >= UTC 还是需要使用 PHP 本地区域? MySQL 会自行调整吗?

我用 gmdate 和 date 做了一些测试,有时它可以工作,其他的则不行。

谢谢

【问题讨论】:

  • 一个标准的 mysql 时间字符串没有 TZ 数据,所以 time_scan_start >= '2012-11-02 03:04:05' 将假定时区都匹配并且直接比较值。 tz 的东西只有在您进行涉及 tz 值的转换/格式化时才会发挥作用。
  • @MarcB 好的,谢谢!所以无论我在 WHERE 中放什么,它都会搜索假设 WHERE 日期没问题并且假设是 UTC(如果 MySQL 设置为 UTC +00:00)?

标签: php mysql timezone


【解决方案1】:

如果您要与TIMESTAMP 字段进行比较,则需要使用服务器时区中的比较值。您可以通过以下方式确定服务器时区:

SELECT @@time_zone;

因此,如果你已经执行了

SET NAMES time_zone = "+0:00";

那么您将使用基于 UTC 的值。

这是因为TIMESTAMP字段以UTC格式存储在MySQL中,并在显示(或比较)之前转换为服务器的时区。

注意:如果您要与 DATETIME 字段或 TIME 字段进行比较,则需要使用与将值插入字段时使用的时区相同的比较值。

这是因为 DATETIMETIME 字段存储在 MySQL 中没有任何时区信息,并且在显示(或比较)之前不会转换。

【讨论】:

    【解决方案2】:

    MySQL DATETIME 对时区一无所知。因此,您需要决定哪个时区将是您的“默认”(通常是 UTC),并使用该时区存储您的所有时间戳,必要时使用CONVERT_TZ

    然后,对搜索执行相同的操作,即将值转换为 UTC,然后在搜索中使用它们。

    【讨论】:

      猜你喜欢
      • 2012-05-08
      • 2020-03-03
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 1970-01-01
      • 2017-04-12
      相关资源
      最近更新 更多