Bukan klausa WHERE, tetapi GROUP BY. Kueri hanya akan mengembalikan data untuk baris yang ada. Itu berarti ketika Anda mengelompokkan berdasarkan tanggal stempel waktu, hanya hari-hari di mana ada baris yang akan dikembalikan. SQL Server tidak dapat mengetahui dari konteks bahwa Anda ingin "mengisi bagian yang kosong", dan tidak tahu dengan apa.
Jawaban normalnya adalah CTE yang menghasilkan semua hari yang ingin Anda lihat, sehingga mengisi bagian yang kosong. Yang ini sedikit rumit karena memerlukan pernyataan SQL rekursif, tetapi ini adalah trik yang terkenal:
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
Memecahnya, CTE menggunakan gabungan yang mereferensikan dirinya sendiri untuk secara rekursif menambahkan satu hari pada satu waktu ke tanggal sebelumnya dan mengingat tanggal itu sebagai bagian dari tabel. Jika Anda menjalankan pernyataan sederhana yang menggunakan CTE dan hanya memilih * darinya, Anda akan melihat daftar tanggal antara awal dan akhir. Kemudian, pernyataan tersebut menggabungkan daftar tanggal ini ke tabel log berdasarkan tanggal stempel waktu log, sambil mempertahankan tanggal yang tidak memiliki entri log menggunakan gabungan kiri (mengambil semua baris dari sisi "kiri" apakah mereka memiliki baris yang cocok di " kanan" atau tidak). Akhirnya, kami mengelompokkan berdasarkan tanggal dan menghitung dan kami akan mendapatkan jawaban yang Anda inginkan.