【问题标题】:Mysql between filter on convert timezone select转换时区选择过滤器之间的Mysql
【发布时间】:2017-05-29 15:35:39
【问题描述】:

请告诉我,我正在复制一个我还没有找到的问题。这是我的问题。

我有一个数据库,其中所有 DateTime 列都存储在 UTC 中。我想知道我是否这样做:

select CONVERT_TZ(event.startingTime,'UTC', city.timezone) as startingTime
left join city on event.cityid = city.id 
where startingTime between '2017-01-01 00:00:00' and '2017-01-01 23:59:59'

这是否适用于已处理时区的过滤器?例如,假设我有一个在 UTC 时间 23:00 开始的活动,但城市是 GMT+2。是否会列出该事件? (数据库中的“原始”数据是 23:00,所以它应该按照那个显示,但是一旦使用时区处理,就是第二天的 1:00,所以它不应该按照这个显示 )。

我做了一个测试,看起来过滤器是处理前的“原始”数据之一,我很难相信,这就是我在这里问的原因(我的mysql版本是10.0.21-MariaDB-1~气喘吁吁)

【问题讨论】:

  • 让我知道这是否对你有用 :)
  • 它开启了有趣的见解。我正在测试所有可能的组合,在选择和位置上有和没有时区。它在select上的未处理数据中确认它确实得到了结果。

标签: mysql timezone mariadb


【解决方案1】:

存储为TIMESTAMP,而不是DATETIME。然后,在获取时,日期和时间将根据客户端指定的时区进行转换。不需要CONVERT_TZ

【讨论】:

  • 有时无法修改架构。
【解决方案2】:

为了安全,你可以做个测试试试:

select CONVERT_TZ(event.startingTime,'UTC', city.timezone) as startingTime
left join city on event.cityid = city.id 
where startingTime 
between CONVERT_TZ('2017-01-01 00:00:00','UTC', '+2:00') 
and CONVERT_TZ('2017-01-01 23:59:00','UTC', '+2:00')

如果您将转换放在where 子句中,它将正确过滤

【讨论】:

  • 这样做我最多可以提前 4 小时。看来我必须反过来转换: CONVERT_TZ('2017-01-01 23:59:00','+2:00', 'UTC')
  • 如果你只在其中一个分支做呢?让我们只说 AND 的右边?
猜你喜欢
  • 2012-04-16
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多