Не толкова клаузата WHERE, а GROUP BY. Заявката ще върне данни само за редове, които съществуват. Това означава, че когато групирате по дата на клеймото за време, ще бъдат върнати само дните, за които има редове. SQL Server не може да знае от контекста, че искате да „попълните празните места“, и няма да знае с какво.
Нормалният отговор е CTE, който произвежда всички дни, които искате да видите, като по този начин попълва празните места. Това е малко сложно, защото изисква рекурсивен SQL оператор, но е добре известен трик:
WITH CTE_Dates AS
(
SELECT @START AS cte_date
UNION ALL
SELECT DATEADD(DAY, 1, cte_date)
FROM CTE_Dates
WHERE DATEADD(DAY, 1, cte_date) <= @END
)
SELECT
cte_date as TIME_STAMP,
ISNULL(COUNT(HL_Logs.Time_Stamp), 0) AS counted_leads,
FROM CTE_Dates
LEFT JOIN HL_Logs ON DATEADD(dd, 0, DATEDIFF(dd, 0, Time_Stamp)) = cte_date
WHERE Time_Stamp between @BEGIN and @END and ID_Location = @LOCATION
GROUP BY cte_date
Разграждайки го, CTE използва обединение, което се препраща към себе си, за да добавя рекурсивно един ден към предишната дата и да запомни тази дата като част от таблицата. Ако изпълните прост оператор, който използва CTE и току-що сте избрали * от него, ще видите списък с дати между началото и края. След това изразът присъединява този списък с дати към таблицата на регистрационния файл въз основа на датата на времевия печат на журнала, като същевременно запазва дати, които нямат записи в журнала, използвайки лявото съединение (взема всички редове от "лявата" страна, независимо дали имат съвпадащи редове на " дясна" страна или не). Накрая групираме по дата и вместо това преброяваме и трябва да получим отговора, който искате.