当前位置: 首页 > 面试题库 >

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

桑宇
2023-03-14
问题内容

我正在从带有查询的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 ::-yperl的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表构建快速csv: 并通过以下方式将它们转储到perl中的文件中: 但是,数据中存在日期差距: 我想填充数据以使用零计数条目填充缺失的日子,最后得到: 我拍了一个非常尴尬的解决方案(几乎肯定是越野车),每月要花几天的时间和一些数学知识,但是在mysql或perl方面都必须有一些更简单的方法。 为什么我这么愚蠢有天才的想法/耳光? 我最终使用了一个存储过程,该

  • 问题内容: 如果您还希望获得结果总数(在进行分页之前),那么在SQL Server 2000、2005、2008、2012中对结果进行分页的最佳方法(从性能角度而言)是什么? 问题答案: 获取结果总数和分页是两个不同的操作。为了这个示例,我们假设您要处理的查询是 在这种情况下,您可以使用以下方法确定结果总数: …这看似效率低下,但假设所有索引等均已正确设置,实际上却表现不错。 接下来,要以分页的方

  • 问题内容: 我正在尝试从MYSQL下载图像(.png)文件。有时它工作正常。无法找到确切的问题。它可以在Jboss服务器上正常工作。尝试在Apche上的本地计算机中运行时引发错误。 请帮助我修复错误。这是我的Java代码。 这是堆栈跟踪输出: 问题答案: 您打了两次电话。我假设您的查询仅返回1行,因为您尝试通过进行匹配。当第二个被调用时,中没有要返回的行。这就是抛出an的原因。像这样删除第一个:

  • 问题内容: 我在用SQL Server填充同一项目的日期和时间时遇到麻烦。以下是三个简单的记录。 我希望我的结果在1行中,并且在Date_Time列中填入一个逗号,然后是逗号。 有人能帮我指出正确的方向/链接或简单的查询来解决问题吗? 谢谢,XH。 问题答案: 如果您使用的是SQL Server 2017或更高版本,则可以使用string_agg如下所示: 如果它在sql server 2017以

  • 问题内容: 我有一张关于不同资产的开/关事件的表格。我需要在不使用游标的情况下获取开始和停止事件时间的列表。 来源: 所需结果: 问题答案: 这是解决方案,带有概念验证供所有人验证。 我注意到的事件被标记为新事件。我解决了这个问题,但是这也导致我编写了一个解决方案,该解决方案允许发生一个已经开始但尚未结束的事件,因此我加入了一个开放式事件。 另外,我的解决方案在重叠的时期内有效。 讲解 我们将数据

  • 问题内容: 我有一个事件表,其中记录了一个开始和结束时间,作为MySQL DATETIME对象(格式。我想查找在特定日期范围内发生的所有事件。但是,事件可能跨越多天(并且超出了我的范围)日期范围,但是如果它们与我的日期范围重叠1秒或更长时间,我想返回它们。 有什么建议吗? 问题答案: 这将找到范围内完全包含的每个事件: 这将查找事件的任何部分与范围的任何部分重叠的任何事件: