当我的所有时间戳都是 UTC 时,如何查询“昨天,在我的时区”

Posted

技术标签:

【中文标题】当我的所有时间戳都是 UTC 时,如何查询“昨天,在我的时区”【英文标题】:How to query for "Yesterday, in my timezone" when all my timestamps are UTC 【发布时间】:2019-06-11 14:07:30 【问题描述】:

我试图在 where 子句中包含一种根据我当前时区自动提取前一天数据的方法。我的所有数据都使用 UTC 时间戳存储。

我可以将时间戳从 UTC 更改为我的时区(“美国/芝加哥”),并且可以自动提取过去 X 天的数据;例如,对于前一周,无需手动输入日期。但我无法弄清楚如何在我的 where 子句中同时执行这两项操作。

SELECT *  
FROM `my-data-set` 
WHERE
event_time >= CAST(DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) AS TIMESTAMP)
AND event_time < CAST(DATE_SUB(CURRENT_DATE(), INTERVAL 0 DAY) AS TIMESTAMP)

我希望能够查看我所在时区的前一周或前一天,而不是前一个 UTC 日期。

【问题讨论】:

顺便说一句,在表/列标识符中使用“-”是一个非常糟糕的主意。 【参考方案1】:

您可以指定时区:

where date(event_time, 'America/Chicago') = date_add(current_date, interval -1 day)

请注意,current_date 不需要括号。

逻辑的关键是将 UTC 时间戳转换为您本地时间的日期。

【讨论】:

简单,容易,我想知道我怎么没有意识到我需要先像这样转换 event_time。非常感谢,这很好用!

以上是关于当我的所有时间戳都是 UTC 时,如何查询“昨天,在我的时区”的主要内容,如果未能解决你的问题,请参考以下文章

时区、时间戳、 时区、格林威治(GMT)、协调世界时(UTC)的关系

查询 Django 模型时,如何将 Django 中的 DateTimeField 从 UTC 转换为最终用户的时区(通常是 PST)?

如何在 JavaScript 中获取 UTC 时间戳?

如何将日期正确转换为 UTC,然后再转换回来?

如何在特定时区(最好是我的应用程序的默认时区,而不是 UTC)中创建新的 DateTime 对象?

如何指定从 EntityFramework 检索的 DateTime 对象应该是 DateTimeKind.UTC [重复]