首頁 >資料庫 >mysql教程 >如何在MySQL中檢索指定範圍內的所有日期,包括沒有記錄的日期?

如何在MySQL中檢索指定範圍內的所有日期,包括沒有記錄的日期?

Linda Hamilton
Linda Hamilton原創
2024-12-13 18:39:10577瀏覽

How to Retrieve All Dates Within a Specified Range in MySQL, Including Dates with No Records?

MySQL:擷取指定範圍內的所有日期,即使沒有記錄

在使用資料庫時,通常需要擷取特定時間段或範圍內的資料。但是,如果該範圍內的某些日期沒有記錄,則結果中可能會跳過這些日期。這可能會導致數據分析和視覺化方面的差距。

問題:

在 MySQL 中,下面的查詢從給定的 users表中選擇日期和相應的計數日期範圍:

SELECT DATE(datecreated), count(*) AS number
FROM users
WHERE DATE(datecreated) > '2009-06-21' AND DATE(datecreated) <= DATE(NOW())
GROUP BY DATE(datecreated)
ORDER BY datecreated ASC

此查詢返回的結果如下as:

date1 5
date2 8
date5 9

但是,它會跳過零用戶的日期,從而在數據中留下空白。所需的輸出將是:

date1 5
date2 8
date3 0
date4 0
date5 9

解決方案:

要檢索指定範圍內的所有日期,即使沒有關聯的記錄,我們可以使用利用產生的日期序列的複雜查詢。下面的查詢完成此操作:

select  * from (
select date_add('2003-01-01 00:00:00.000', INTERVAL n5.num*10000+n4.num*1000+n3.num*100+n2.num*10+n1.num DAY ) as date from
(select 0 as num
   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n1,
(select 0 as num
   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n2,
(select 0 as num
   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n3,
(select 0 as num
   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n4,
(select 0 as num
   union all select 1
   union all select 2
   union all select 3
   union all select 4
   union all select 5
   union all select 6
   union all select 7
   union all select 8
   union all select 9) n5
) a
where date >'2011-01-02 00:00:00.000' and date < NOW()
order by date

此查詢使用嵌套的 UNION ALL 子查詢來產生從 2003 年 1 月 1 日到當前日期之前的日期序列。然後使用 date_add() 函數將產生的日期增量新增至開始日期以建立所需的日期範圍。

附加說明:

  • 調整'2011-01-02 00:00:00.000' 和NOW() 值指定所需的開始和結束
  • 如果記錄存在於查詢中指定的日期範圍之外,它們仍然會包含在結果中。
  • 此解決方案不依賴表結構或使用者表中是否存在記錄。它產生指定範圍內的完整日期序列,並將結果與表中的資料(如果有)連接起來。

以上是如何在MySQL中檢索指定範圍內的所有日期,包括沒有記錄的日期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn