Mysql-Count-Timerange-in-Different-Timezone.md

時間區間分組 (Translated by ChatGTP)

假設我們有一個名為 target_table 的資料表,

我們想要計算 target_table 資料表中不同時間區間的總記錄數,

我們要以 created_at 欄位(儲存 Unix 時間)作為分組依據,

並將其轉換為它自己的分組。

舉例來說,

如果我們想要將每 10 分鐘分為一個組並計算總記錄數,

10:00:0010:09:59 為一組,

10:10:0010:19:59 為另一組,

我們可以做像這樣的事情:

floor(created_at / 60 / 10) * 60 * 10)

其中 10 是我們想要分組的分鐘數。

你也可以計算整天的時間,

例如,

floor(created_at / 60 / 1440) * 60 * 1440)

時區問題

如果您的系統有多個時區,

例如,

這個客戶的數據位於 +8:00 時區,

而另一個客戶的數據位於 +0:00 時區,

如果我們使用完全相同的查詢,會有什麼問題?

假設我們想要計算整天的總記錄數,

並且有兩個資料表,

custom_1.target_table

custom_2.target_table

custom_1.target_table 的時區是 +8:00

custom_2.target_table 的時區是 +0:00

在 Unix 時間的 0 時,

+0:001970-01-01 00:00:00

+8:001970-01-01 08:00:00

因此在此查詢中,

floor(created_at / 60 / 1440) * 60 * 1440)

我們計算 +0:00 時區的時間範圍是

1970-01-01 00:00:001970-01-01 23:59:59

但對於 +8:00 時區,

則是 1970-01-01 08:00:001970-01-01 23:59:59

這不是我們想要的。

解決方案

根據時區添加偏移量,

在以下查詢中,

28800 是 +8:00 時區的偏移量,

而 ‘+8:00’ 是我們想要轉換的時區。

SELECT 
created_at as origin,
date_format(
    CONVERT_TZ(
        FROM_UNIXTIME(
    floor((created_at + 28800) / 60 / 1440) * 60 * 1440), 
        '+8:00', '+0:00'), 
    '%Y-%m-%d %H:%i:%s') 
as range_start,
FROM target_table
order by id ;