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

标签 mysql perl calendar datediff

我正在从 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/36164242/

相关文章:

perl - 如何从 hashref 中的文件句柄中读取一行

javascript - Perl CGI,多个表单和多个提交按钮,在同一页面上执行操作

database - 为日历应用程序布置数据库架构

mysql - 触发:Do not execute INSERT INTO when SELECT returns no result

mysql - 简化 mysql 查询

mysql - 使用 MySQL Workbench 的存储过程

mysql - 使用两个不同的 WHERE 条件更新 MySQL 中的两个表

perl - 带括号和不带括号的eof之间的区别? (Perl5)

java - Calendar.get(Calendar.DAY_OF_WEEK) 是否受 Calendar.getFirstDayOfWeek() 影响?

javascript - 伊斯兰(回历)日历的 Javascript Intl.DateTimeFormat() 输出在 'islamic' 和 'ar-SA' 之间存在差异