开发者社区> 问答> 正文

在SQL结果中(在mysql或perl端)填充空日期的最直接方法是什么?

我正在从带有查询的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迭代答案也非常好,我希望我可以选择多个答案!

展开
收起
保持可爱mmm 2020-05-10 18:50:58 484 0
1 条回答
写回答
取消 提交回答
  • 当在服务器端需要类似的内容时,通常会创建一个表,其中包含两个时间点之间的所有可能的日期,然后将该表与查询结果连接起来。像这样:

    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,则添加一些附加字符串。来源:stack overflow

    2020-05-10 18:51:33
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载

相关镜像