繁体   English   中英

MySQL 查询特定时区

[英]MySQL query with specific timezone

我有一个为我的 Laravel/PHP 应用程序存储数据的数据库。 所有数据都以 UTC 格式存储在数据库中。

我正在编写一个查询来获取按日期和小时分组的数据,以便我可以 plot 图表上的数据。

我们的 UI 显示America/Los_Angeles时区的报告数据。

我要做的是获取最近三天的数据,但根据America/Los_Angeles的报告时区进行查询。

要获得BETWEEN日期,我使用以下

$from = now()
    ->startOfDay()
    ->subDays(3)
    ->timezone('America/Los_Angeles');

$to = now()
    ->endOfDay()
    ->timezone('America/Los_Angeles');

这工作正常。 因此,下一步是将数据分组,但不将其分组到列 data 上,因为那将是UTC 我想组在Los_Angeles时区。 所以我正在做下面的事情。

SELECT
  DATE(CONVERT_TZ(created_at, '+00:00', '-07:00')) AS grouped_date,
  HOUR(CONVERT_TZ(created_at, '+00:00', '-07:00')) AS grouped_hour,
  count(*) AS requests
FROM
  `advert_requests`
WHERE
  created_at BETWEEN '2022-09-09 17:00:00' AND '2022-09-13 16:59:59'
GROUP BY
  grouped_date,
  grouped_hour

我遇到的随机问题是分组数据从2022-09-09年 9 月 9 日10:00开始,我不知道为什么。

2022-09-09 17:00:00 America/Los_Angeles开始BETWEEN2022-09-10 00:00:00 UTC所以在created_at上执行CONVERT_TZ时,分组数据不应该从0开始吗?

在此处输入图像描述

有任何想法吗?

当然,这并不像在我运行报告SELECT查询的会话中将时区设置为报告时区那样简单。

所以我可以将其他所有内容保留为UTC 我的应用程序是UTC并在 php/application.xml 中处理时区转换。 我的数据库设置为UTC 我的 MySQL INSERT等都是UTC 然后,当我想使用我们的固定报告时区America/Los_Angeles查询要在 UI 中显示的任何内容时,我可以在运行SELECT查询之前设置它吗?

SET time_zone = '-07:00';

// In the Laravel framework
// DB::update('SET time_zone = ?', ['-07:00']);

接着

SELECT
  DATE(created_at) AS grouped_date,
  HOUR(created_at) AS grouped_hour,
  count(*) AS requests
FROM
  `advert_requests`
WHERE
  created_at BETWEEN '2022-09-10 00:00:00'
  AND '2022-09-13 23:59:59'
GROUP BY
  grouped_date,
  grouped_hour

暂无
暂无

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

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