Không quá nhiều mệnh đề WHERE, mà là GROUP BY. Truy vấn sẽ chỉ trả về dữ liệu cho các hàng tồn tại. Điều đó có nghĩa là khi bạn đang nhóm theo ngày của dấu thời gian, chỉ những ngày có hàng sẽ được trả lại. SQL Server không thể biết từ ngữ cảnh mà bạn muốn "điền vào chỗ trống" và nó sẽ không biết điều gì với.
Câu trả lời bình thường là CTE tạo ra tất cả các ngày bạn muốn xem, do đó điền vào chỗ trống. Đây là một thủ thuật hơi phức tạp vì nó yêu cầu một câu lệnh SQL đệ quy, nhưng đó là một thủ thuật nổi tiếng:
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
Chia nhỏ nó ra, CTE sử dụng liên hợp tự tham chiếu để thêm đệ quy từng ngày một vào ngày trước đó và ghi nhớ ngày đó như một phần của bảng. Nếu bạn chạy một câu lệnh đơn giản sử dụng CTE và chỉ chọn * từ nó, bạn sẽ thấy danh sách các ngày từ đầu đến cuối. Sau đó, câu lệnh kết hợp danh sách ngày này với bảng nhật ký dựa trên ngày dấu thời gian của nhật ký, trong khi vẫn giữ nguyên các ngày không có mục nhật ký bằng cách sử dụng phép nối bên trái (lấy tất cả các hàng từ phía "bên trái" cho dù chúng có các hàng phù hợp trên " bên phải ”hoặc không). Cuối cùng, chúng tôi nhóm theo ngày và đếm thay vào đó, chúng tôi sẽ nhận được câu trả lời bạn muốn.