SQL - 显示给定范围内的所有日期,并使用数据库中的时间戳计算该日期有多少帖子

Posted

技术标签:

【中文标题】SQL - 显示给定范围内的所有日期,并使用数据库中的时间戳计算该日期有多少帖子【英文标题】:SQL - Show all dates in a given range and count how many posts there are on that date using a timestamp from database 【发布时间】:2021-05-23 09:59:41 【问题描述】:

我创建了一个查询,它将计算帖子的数量并按日期对它们进行分组,但是结果不显示没有帖子的日期。

查询:

SELECT DATE(Date_Uploaded) AS ForDate
     , COUNT(*) AS NumPosts 
  FROM Articles 
 WHERE 'Status'='4' 
 GROUP 
    BY DATE(Date_Uploaded) 
 ORDER 
    BY ForDate

对于 info 'Status' = 4 表示帖子已在网站上发布,而 'Date_Uploaded' 是发布的时间戳

这将例如返回;

2020-09-10: 2 2020-09-14: 1 2020-09-25: 4

随心所欲;

2020-09-10: 2 2020-09-11: 0 2020-09-12: 0 2020-09-13: 0 2020-09-14: 1

等等

我需要这样的数据的原因是我可以将它与谷歌图表一起使用来创建一个柱形图,显示一段时间内的帖子数量。通过不包括没有帖子的日期,图表将不会格式化缺失的日期。

如果有办法仍然使用相同的查询,但使用谷歌图表适当地分隔数据,这也是一个很好的解决方案。

谢谢。

编辑:日期范围将在我打算使用数据放置图表的同一页面上定义

【问题讨论】:

用您正在使用的数据库标记您的问题。 您需要从某个地方获取您的日期。许多人发现“数字表”很有帮助,这可能是一种用途 - 结合基于运行日期的日期“种子”。您至少需要考虑指定一个日期范围(最近 x 天?)。 了解您的 DBMS(和版本)可能会有所帮助,例如 SQL Server、mysql、Oracle ... 考虑处理表示层/应用程序级代码中的数据显示问题(例如丢失数据),假设您有(例如作用于有序数组的简单 php 循环)。 【参考方案1】:

如果您有所有日期的数据,但没有status = 4,那么您可以使用条件聚合

SELECT DATE(Date_Uploaded) AS ForDate,
       SUM(CASE WHEN Status = 4 THEN 1 ELSE 0 END) AS NumPosts
FROM Articles 
GROUP BY DATE(Date_Uploaded)
ORDER BY ForDate;

否则,您需要使用包含日期(或数字)的表格或生成它们并使用LEFT JOIN。但是,确切的语法取决于数据库。

编辑:

在 MySQL 中,您可以使用递归 CTE 来生成日期:

with recursive dates as (
      select date('2020-09-10') as date
      union all
      select date + interval 1 day
      from dates
      where date < '2020-09-25'
     ) 
select d.date, count(a.date_uploaded)
from dates d left join
     articles a
     on a.date_uploaded >= d.date and
        a.date_uploaded < d.date + interval 1 day and
        a.status = 4
group by d.date;

【讨论】:

感谢您的建议,不幸的是,即使我不查看 Status = 4,仍然没有所有日期的数据。创建一个新表是我唯一的解决方案吗? @callumcheney 。 . . 用您正在使用的数据库标记您的问题 @callumcheney 。 . .在 MySQL 中,您可以使用递归 CTE 来生成日期。我修改了答案。 感激不尽!您使用递归日期的解决方案有效,并为我提供了我所需要的。

以上是关于SQL - 显示给定范围内的所有日期,并使用数据库中的时间戳计算该日期有多少帖子的主要内容,如果未能解决你的问题,请参考以下文章

s-s-rS 未显示日期范围内的所有数据

统计日期范围内的天数

在python中生成给定范围内的所有日期

Oracle SQL 返回日期内的所有记录

使用范围内的日期来连接和显示所有日期?

sql 查询指定用户ID在指定日期范围内的所有数据