我正在从 mysql 表中构建一个快速 csv,其查询如下:
select DATE(date),count(date) from table group by DATE(date) order by date asc;
然后将它们转储到 perl 中的文件中:
while(my($date,$sum) = $sth->fetchrow) {
print CSV "$date,$sum\n"
}
但数据中存在日期差距:
| 2008-08-05 | 4 |
| 2008-08-07 | 23 |
我想用零计数条目填充数据以填补缺失的日期:
| 2008-08-05 | 4 |
| 2008-08-06 | 0 |
| 2008-08-07 | 23 |
我用每月的天数和一些数学计算了一个非常尴尬(而且几乎肯定有问题)的解决方法,但是在 mysql 或 perl 方面必须有一些更直接的方法。
我为什么这么笨,有什么天才的想法/耳光吗?
我最终使用了一个存储过程,它为相关日期范围生成了一个临时表,原因有两个:
- 我知道我每次都会寻找的日期范围
- 不幸的是,有问题的服务器不是我可以在 atm 上安装 perl 模块的服务器,而且它的状态已经很陈旧,以至于它没有远程安装任何东西 Date::-y
perl 的 Date/DateTime 迭代答案也很好,我希望我可以选择多个答案!
最佳答案
当您在服务器端需要类似的东西时,您通常会创建一个包含两个时间点之间所有可能日期的表,然后将该表与查询结果左连接。像这样的:
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
在这种特殊情况下,最好在客户端进行一些检查,如果当前日期不是 previos+1,则添加一些附加字符串。
关于mysql - 在 sql 结果中填充空日期的最直接方法是什么(在 mysql 或 perl 端)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75752/