小编典典

我如何在两个日期之间带回SQL中的整个日期范围,即使没有数据也是如此?

sql

尝试以以下格式获取数据库中的事件数:

date   numberOfIncidents
date   numberOfIncidents
date   numberOfIncidents
date   numberOfIncidents

我将开始日期/结束日期提供给我的SQL存储过程,但是如果数据库中没有针对特定日期的条目(因为未发生任何事件),那么我将无法获得完整范围。

我想要的是在开始/结束日期之间返回的每个日期,旁边都有一个值。

在SQL Server中可以吗?


阅读 121

收藏
2021-04-22

共1个答案

小编典典

您可以使用递归公用表表达式来生成日期范围,然后将其加入事件中。

WITH DateRange(date) AS
(
  SELECT @dateFrom date
  UNION ALL
  SELECT DATEADD(dd, 1, date) date FROM DateRange WHERE date < @dateTo
)

SELECT DateRange.date, count(incident.id) 
FROM DateRange
LEFT OUTER JOIN incident
  ON incident.date >= DateRange.date 
  AND incident.date < DATEADD(dd, 1, DateRange.date)
GROUP BY DateRange.date
ORDER BY DateRange.date

默认情况下,SQL Server将递归定义限制为100行。如果您需要100个以上的日期行,请追加OPTION (MAXRECURSION n)到查询末尾,更改n为所需的行数。

2021-04-22