Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एसक्यूएल सर्वर लापता तिथियां प्रदर्शित कर रहा है

मैं आपको 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 . से संदर्भित होना चाहिए



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql सर्वर अल्पविराम से अलग किए गए मानों को स्तंभों में विभाजित करता है

  2. SQL संग्रहीत कार्यविधि प्राप्त करना RODBC का उपयोग करके data.frame प्रारूप में परिणाम देता है

  3. Microsoft SQL सर्वर त्रुटि 18456 का समस्या निवारण

  4. SQL सर्वर में तालिका में डुप्लिकेट रिकॉर्ड्स में से एक को छोड़कर सभी को अपडेट करें

  5. एसएसआईएस एपीआई:कोई कैसे जानता है कि किस इंटरफ़ेस को __COMObject डालना है?