簡體   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