当使用 datepart 那个小时没有任何返回时,如何为记录计数返回 0?

Ang*_*ith 4 sql-server

在下面的示例查询中,我正确地按小时计算计数,但我需要它返回一天中的所有小时,并为没有数据的小时显示 0。有没有一种简单的方法可以让我做到这一点?

这是我的 SQL:

IF OBJECT_ID(N'tempdb..#Temp') IS NOT NULL DROP TABLE #Temp;

CREATE TABLE #Temp (TempNumber NVARCHAR(50),TempDateTime DATETIME2)

INSERT INTO #Temp (TempNumber, TempDateTime) 
VALUES ('11287233600','2019-08-20 08:27:08.047')

INSERT INTO #Temp (TempNumber, TempDateTime) 
VALUES ('11287233601','2019-08-20 08:32:08.047')

INSERT INTO #Temp (TempNumber, TempDateTime) 
VALUES ('11287233602','2019-08-20 10:27:08.047')

INSERT INTO #Temp (TempNumber, TempDateTime) 
VALUES ('11287233603','2019-08-20 12:27:08.047')

INSERT INTO #Temp (TempNumber, TempDateTime) 
VALUES ('11287233604','2019-08-20 16:27:08.047')

INSERT INTO #Temp (TempNumber, TempDateTime) 
VALUES ('11287233605','2019-08-20 23:27:08.047')

SELECT DATEPART(hh,TempDateTime) AS TempDatePart,
COUNT(DISTINCT TempNumber) AS RecordCount
FROM #Temp
GROUP BY DATEPART(hh, TempDateTime)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这是我要找的:

在此处输入图片说明

scs*_*mon 5

您可以使用所有小时 (0-23) 的表构造函数,并从您的DATEPART函数加入该构造函数。

数据库小提琴

SELECT 
   h.h as DatePartHour, 
   --DATEPART(hour,TempDateTime) AS TempDatePart,
   COUNT(DISTINCT TempNumber) AS RecordCount
FROM #Temp
   full join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(0)) h(h)
   on h.h = DATEPART(hour,TempDateTime)
GROUP BY  h.h
Run Code Online (Sandbox Code Playgroud)