Saya akan merekomendasikan Anda menggunakan table valued function
untuk memberi Anda semua hari di antara 2 tanggal yang dipilih sebagai tabel (Cobalah di biola ini)
:
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
(Saya menyertakan pengaturan tabel sederhana untuk pengujian copypaste yang mudah)
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'
sekarang Anda dapat dengan mudah memeriksa hari apa tidak ada kunjungan yang terjadi ketika Anda mengetahui "hari batas" seperti ini:
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')
Atau jika Anda ingin mengetahui semua hari di mana situs mana pun tidak dikunjungi, Anda dapat menggunakan kueri ini:
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
Sebagai catatan tambahan:sepertinya Anda memiliki beberapa duplikasi di tabel Anda (tidak dinormalisasi) siteName
harus benar-benar masuk ke tabel terpisah dan hanya dirujuk dari SiteVisit