如何在两个日期之间的SQL中恢复整个日期范围,即使没有数据?

Nib*_*Pig 2 sql sql-server

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

date   numberOfIncidents
date   numberOfIncidents
date   numberOfIncidents
date   numberOfIncidents
Run Code Online (Sandbox Code Playgroud)

我为我的SQL存储过程提供了开始日期/结束日期,但如果数据库中没有特定日期的条目(因为没有发生事件),那么我将无法获得全部范围.

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

这可能在SQL Server中吗?

Phi*_*oss 9

您可以使用递归公用表表达式生成日期范围,然后将其连接到事件.

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
Run Code Online (Sandbox Code Playgroud)

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