繁体   English   中英

MySQL - 查询“今天”创建的记录,但日期是 UTC

[英]MySQL - Querying for records created “today”, but date is in UTC

我目前以 UTC 格式存储我的日期时间,并且出于所有目的,到目前为止它运行良好。 但是现在我想查询在特定日期(例如今天)在我自己的时区(东部时区)中创建的记录。

由于时间不同,我目前创建的记录将具有明天的日期。 例如,日期部分将目前是2016-06-20在我的时区,但UTC是2016-06-21

当记录存储为 UTC 时,如何准确获取我自己时区中特定日期的记录? 我在想我可以使用convert_tz函数将存储的值转换为 Eastern,并将其用作我的where子句的一部分。 这样日期就匹配了。 这是一个可靠的解决方案吗?

将您要搜索的日期时间边界转换为 UTC。

CONVERT_TZ 函数很方便。 像这样的东西:

WHERE my_utc_date_time_col >= CONVERT('2016-02-20','EST5EDT','+00:00') 
  AND my_utc_date_time_col <  CONVERT('2016-02-20','EST5EDT','+00:00') + INTERVAL 1 DAY

(这假设您已填充 MySQL 时区表,因此支持命名时区。)

这实际上相当于:

WHERE my_utc_date_time_col >= '2016-02-20' + INTERVAL 4 HOUR
  AND my_utc_date_time_col <  '2016-02-20' + INTERVAL 4 HOUR + INTERVAL 1 DAY

WHERE my_utc_date_time_col >= '2016-02-20 04:00:00'
  AND my_utc_date_time_col <  '2016-02-21 04:00:00'

如果要引用NOW()等函数来获取当前日期,那么 MySQL 连接的时区将很重要,因为返回的日期时间值将在 MySQL 连接的 time_zone 中。

SHOW VARIABLES LIKE 'time_zone' ; 

请注意,我们更喜欢在文字方面而不是在列上进行转换,因为如果我们在列上进行转换,这将迫使 MySQL 对表中的每一行执行转换,并比较文字。 当我们在文字方面进行转换时,这允许 MySQL 有效地使用索引范围扫描操作(具有适当的索引可用)。

CONVERT_TZ函数实际上正是您所需要的。 但我不同意:

我可以使用 convert_tz 函数将存储的值转换为 Eastern,并将其用作 where 子句的一部分。

因为在WHERE子句上使用函数可能会降低性能。

如果您使用存储过程,我建议您先转换输入日期,然后在SELECT语句中使用它们。 它看起来像这样:

SET @fromDate = CONVERT_TZ(@fromDate, ...) --Convert to UTC
SET @toDate = CONVERT_TZ(@toDate, ...) --Convert to UTC

SELECT *
    FROM TableA A
    WHERE A.FromDate BETWEEN @fromDate AND @toDate

http://ee1.php.net/manual/en/class.datetime.php

$foo = new DateTime("today", new DateTimeZone("America/Vancouver"));
var_dump($foo->format('c'), $foo->format('U'));
$foo->setTimeZone(new DateTimeZone("UTC"));
var_dump($foo->format('c'), $foo->format('U'), $foo->format('Y-m-d H:i:s'));

输出:

string(25) "2016-06-20T00:00:00-07:00"
string(10) "1466406000"
string(25) "2016-06-20T07:00:00+00:00"
string(10) "1466406000"
string(19) "2016-06-20 07:00:00"

https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html

    SELECT DATE(CONVERT_TZ(NOW(), 'UTC', 'America/Vancouver')) as VancouverToday;

我不是说这是优化的、快速的等等。我只是说如果你存储了 UTC 值和/或你的服务器是 UTC 并且你正在寻找今天的比较,这会显示你“今天”调整为您的时区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM