Niet zozeer de WHERE-clausule, maar de GROUP BY. De query retourneert alleen gegevens voor bestaande rijen. Dat betekent dat wanneer u groepeert op de datum van het tijdstempel, alleen dagen worden geretourneerd waarvoor er rijen zijn. SQL Server kan uit de context niet weten dat u "de lege plekken wilt invullen", en het zou ook niet weten waarmee.
Het normale antwoord is een CTE die alle dagen produceert die u wilt zien, en dus de lege plekken opvult. Deze is een beetje lastig omdat er een recursieve SQL-instructie voor nodig is, maar het is een bekende truc:
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
Om het op te splitsen, gebruikt de CTE een unie die naar zichzelf verwijst om recursief één dag tegelijk toe te voegen aan de vorige datum en die datum te onthouden als onderdeel van de tabel. Als u een eenvoudige instructie uitvoerde die de CTE gebruikte en er net * uit selecteerde, zou u een lijst met datums tussen begin en einde zien. Vervolgens voegt de instructie deze lijst met datums toe aan de logboektabel op basis van de tijdstempeldatum van het logboek, terwijl datums die geen logboekvermeldingen hebben behouden blijven met behulp van de linker join (neemt alle rijen van de "linker" kant, ongeacht of ze overeenkomende rijen hebben op de " rechterzijde of niet). Ten slotte groeperen we op datum en tellen we in plaats daarvan en we zouden het gewenste antwoord moeten krijgen.