在 MySQL 中检索两个日期之间的数据时填充缺失的日期
在 MySQL 中,当使用 BETWEEN 运算符选择两个日期之间的数据时,它是指定范围内的某些日期可能没有任何对应数据。这可能会导致查询结果中出现空行或缺失行。
问题陈述:
考虑一个名为“tbl”的表,其中包含与日期关联的数据,如下所示:
Date | Data |
---|---|
2009-06-25 | 75 |
2009-07-01 | 100 |
2009-07-02 | 120 |
如果我们想检索 '2009-06-25' 到 '2009-06-25' 之间的所有数据'2009-07-01' 使用以下查询:
SELECT data FROM tbl WHERE date BETWEEN '2009-06-25' AND '2009-07-01';
查询将仅返回现有数据在指定范围内的行。这意味着没有任何数据的日期,例如“2009-06-26”、“2009-06-27”和“2009-06-28”,将从结果中省略。
解决方案:用于填充缺失日期的日历表
解决此问题并包含所有日期在指定的范围内,无论是否有数据,我们都可以利用一个称为“日历表”的概念。这些表有助于生成给定间隔内的日期序列,本质上充当所有可能日期的“伪”表。
以下是如何在 MySQL 中创建日历表的示例:
-- Create a table with integers from 0 to 9 CREATE TABLE ints (i INTEGER); INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); -- Generate a sequence of dates from '2009-06-25' to '2009-07-01' SELECT '2009-06-25' + INTERVAL a.i * 10 + b.i DAY AS date FROM ints a JOIN ints b WHERE date BETWEEN '2009-06-25' AND '2009-07-01';
创建日历表后,您可以与数据表执行左连接以填充缺失的日期。以下是更新后的查询:
SELECT cal.date, tbl.data FROM ( SELECT '2009-06-25' + INTERVAL a.i * 10 + b.i DAY AS date FROM ints a JOIN ints b WHERE date BETWEEN '2009-06-25' AND '2009-07-01' ) cal LEFT JOIN tbl ON cal.date = tbl.date WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01';
此查询检索指定范围内的所有日期,包括“tbl”表中没有任何数据的日期。缺少数据的日期将在“数据”列中具有 NULL 值。
以上是如何填充 MySQL 查询中两个日期之间缺失的日期?的详细内容。更多信息请关注PHP中文网其他相关文章!