Tôi khuyên bạn nên sử dụng table valued function
để giúp bạn có tất cả các ngày trong khoảng giữa 2 ngày đã chọn dưới dạng bảng (Hãy dùng thử trong fiddle này)
:
CREATE FUNCTION dbo.GetAllDaysInBetween(@FirstDay DATETIME, @LastDay DATETIME)
RETURNS @retDays TABLE
(
DayInBetween DATETIME
)
AS
BEGIN
DECLARE @currentDay DATETIME
SELECT @currentDay = @FirstDay
WHILE @currentDay <= @LastDay
BEGIN
INSERT @retDays (DayInBetween)
SELECT @currentDay
SELECT @currentDay = DATEADD(DAY, 1, @currentDay)
END
RETURN
END
(Tôi đưa vào một thiết lập bảng đơn giản để dễ dàng kiểm tra copypaste)
CREATE TABLE SiteVisit (ID INT PRIMARY KEY IDENTITY(1,1), visitDate DATETIME, visitSite NVARCHAR(512))
INSERT INTO SiteVisit (visitDate, visitSite)
SELECT '2014-03-11', 'site1'
UNION
SELECT '2014-03-12', 'site1'
UNION
SELECT '2014-03-15', 'site1'
UNION
SELECT '2014-03-18', 'site1'
UNION
SELECT '2014-03-18', 'site2'
bây giờ bạn có thể chỉ cần kiểm tra những ngày không có lượt truy cập nào xảy ra khi bạn biết "các ngày ranh giới", chẳng hạn như sau:
SELECT
DayInBetween AS missingDate,
'site1' AS visitSite
FROM dbo.GetAllDaysInBetween('2014-03-11', '2014-03-18') AS AllDaysInBetween
WHERE NOT EXISTS
(SELECT ID FROM SiteVisit WHERE visitDate = AllDaysInBetween.DayInBetween AND visitSite = 'site1')
Hoặc nếu bạn muốn biết tất cả các ngày mà bất kỳ trang web nào không được truy cập, bạn có thể sử dụng truy vấn này:
SELECT
DayInBetween AS missingDate,
Sites.visitSite
FROM dbo.GetAllDaysInBetween('2014-03-11', '2014-03-18') AS AllDaysInBetween
CROSS JOIN (SELECT DISTINCT visitSite FROM SiteVisit) AS Sites
WHERE NOT EXISTS
(SELECT ID FROM SiteVisit WHERE visitDate = AllDaysInBetween.DayInBetween AND visitSite = Sites.visitSite)
ORDER BY visitSite
Chỉ cần lưu ý nhỏ:có vẻ như bạn có một số trùng lặp trong bảng của mình (không được chuẩn hóa) siteName
thực sự nên đi vào một bảng riêng biệt và chỉ được tham chiếu từ SiteVisit