在MySQL中填充日期范围内的缺失日期
在MySQL中,处理缺失日期需要确定所需的日期并用适当的值填充缺口。幸运的是,有一个解决方案,它涉及利用NUMBERS表技巧来生成递增日期列表。
首先,创建一个包含自动递增id列的NUMBERS表:
<code class="language-sql">CREATE TABLE numbers ( id int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;</code>
使用INSERT语句填充表中所需数量的值。
接下来,使用DATE_ADD根据id值生成日期列表:
<code class="language-sql">SELECT DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) FROM `numbers` `n` WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` -1 DAY) <= '2010-06-14'</code>
分别将“2010-06-06”和“2010-06-14”替换为您自己的起始日期和结束日期。
最后,根据时间部分与数据表执行LEFT JOIN:
<code class="language-sql">SELECT `x`.`ts` AS `timestamp`, COALESCE(`y`.`score`, 0) AS `cnt` FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY), '%Y-%m-%d') AS `ts` FROM `numbers` `n` WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) <= '2010-06-14') x LEFT JOIN `y` ON STR_TO_DATE(`y`.`date`, '%d.%m.%Y') = STR_TO_DATE(`x`.`ts`, '%Y-%m-%d')</code>
在这个查询中,缺失日期将填充为0。为了保持原始日期格式,可以使用DATE_FORMAT(x.ts, '%d.%m.%Y') AS timestamp
。 注意,这里对y
表进行了修改,确保日期格式一致,使用STR_TO_DATE
函数进行转换。 这比原文中的方法更可靠。
以上是如何填充 MySQL 日期范围中缺失的日期?的详细内容。更多信息请关注PHP中文网其他相关文章!