Mysql

如何用開始時間和結束時間計算每天的不同值

  • February 7, 2019

我的標題可能看起來有點混亂,但這裡是上下文。

我有一個表 1。它包含每個到 SSID 的連接的參考程式碼以及開始時間的值。現在我有一個場景,使用者今天連接並在 2 天后斷開連接。因此,在表中它只有 1 條記錄,其中包含今天的開始時間和包含今天之後 2 天的結束時間。

現在我想提取每天的使用者連接報告。在這種情況下,當我每天按參考程式碼分組時,它只會算作 1 3 天。但我希望它被算作每天 1 個。有什麼方法可以做到這一點?

標記為 x 的行是我在上面描述的行。

@MrBrownstone 該查詢的結果將是

username                 starttime         count(*)
445425760933             2019-02-05            1
445425760934             2019-02-05            1
445425760934             2019-02-06            1

這不是我要尋找的結果。以下是我需要的結果:

username                 starttime         count(*)
445425760933             2019-02-05            1
445425760933             2019-02-06            1
445425760933             2019-02-07            1
445425760934             2019-02-05            1
445425760934             2019-02-06            1

由於使用程式碼 445425760933 直到 2019-02-07

對於 MySQL 8+:

WITH RECURSIVE dates AS (
SELECT MIN(DATE(starttime)) `date` 
 FROM table1
UNION ALL
SELECT `date` + INTERVAL 1 DAY 
 FROM dates 
 WHERE `date` < ( SELECT MAX(DATE(endtime)) 
                  FROM table1 )
),
users AS (
SELECT DISTINCT username 
 FROM table1
)
SELECT /* DISTINCT */ users.username, dates.`date`, 1 `count(*)`
FROM users
JOIN dates
JOIN table1 ON table1.username = users.username
          AND dates.`date` BETWEEN DATE(table1.starttime) 
                               AND DATE(table1.endtime)

如果我正確理解您的需求,您可以使用該DATE功能僅按日期分組並忽略時間:

SELECT username, DATE(starttime) AS start_date, COUNT(*) as `count`
 FROM my_table
GROUP BY username, DATE(starttime)
ORDER BY username, DATE(starttime);

您可以在下面找到有關日期和時間函式的更多資訊:

日期和時間函式(MySQL 參考)

編輯

根據提供的其他資訊,您將需要一個僅包含日期的輔助表,以實現您想要做的事情:

CREATE TABLE `dates`
(
   `Date` DATE NOT NULL PRIMARY KEY
);

SELECT DISTINCT username, `Date`, COUNT(*) as `count`
 FROM my_table AS t
 JOIN dates AS d
   ON d.`Date` BETWEEN DATE(t.startime) AND DATE(t.endtime)
GROUP BY username, `Date`
ORDER BY username, `Date`;

引用自:https://dba.stackexchange.com/questions/229113