P粉7331667442023-08-25 00:59:49
当我需要处理这个问题时,为了填补缺失的日期,我实际上创建了一个参考表,只包含我感兴趣的所有日期,并在日期字段上将数据表连接起来。这很简单粗暴,但它有效。
SELECT DATE(r.date),count(d.date) FROM dates AS r LEFT JOIN table AS d ON d.date = r.date GROUP BY DATE(r.date) ORDER BY r.date ASC;
至于输出,我会使用SELECT INTO OUTFILE而不是手动生成CSV。这样我们就不必担心转义特殊字符的问题。
P粉5936497152023-08-25 00:39:00
当您在服务器端需要类似的东西时,通常会创建一个包含两个时间点之间所有可能日期的表,然后将此表与查询结果进行左连接。类似于以下内容:
create procedure sp1(d1 date, d2 date) declare d datetime; create temporary table foo (d date not null); set d = d1 while d <= d2 do insert into foo (d) values (d) set d = date_add(d, interval 1 day) end while select foo.d, count(date) from foo left join table on foo.d = table.date group by foo.d order by foo.d asc; drop temporary table foo; end procedure
在这种特定情况下,最好在客户端进行一些检查,如果当前日期不是前一天的后一天,则添加一些附加字符串。