मैं आपको table valued function
का उपयोग करने की सलाह दूंगा तालिका के रूप में आपको 2 चयनित तिथियों के बीच सभी दिन प्राप्त करने के लिए (इसे इस पहेली में आज़माएं)
:
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
(मैं आसान कॉपीपेस्ट-परीक्षणों के लिए एक साधारण टेबल सेटअप शामिल करता हूं)
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'
अब आप आसानी से जांच सकते हैं कि कौन से दिन कोई विज़िट नहीं हुई जब आप "सीमा दिवस" जैसे जानते हैं:
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')
या यदि आप उन सभी दिनों में जानना चाहते हैं जहां कोई साइट नहीं देखी गई तो आप इस प्रश्न का उपयोग कर सकते हैं:
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
बस एक तरफ ध्यान दें:ऐसा लगता है कि आपकी तालिका में कुछ दोहराव है (सामान्यीकृत नहीं) siteName
वास्तव में एक अलग तालिका में जाना चाहिए और केवल SiteVisit
. से संदर्भित होना चाहिए