Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Server zeigt fehlende Daten an

Ich würde Ihnen empfehlen, eine table valued function zu verwenden um Ihnen alle Tage zwischen 2 ausgewählten Daten als Tabelle zu geben (Probieren Sie es in dieser Geige aus) :

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

(Ich füge einen einfachen Tabellenaufbau für einfache Copypaste-Tests bei)

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'

Jetzt können Sie einfach überprüfen, an welchen Tagen kein Besuch stattfand, wenn Sie die "Grenztage" kennen, wie zum Beispiel:

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')

Oder wenn Sie alle Tage wissen möchten, an denen eine Seite nicht besucht wurde, können Sie diese Abfrage verwenden:

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

Nur als Nebenbemerkung:Es scheint, dass Sie einige Duplikate in Ihrer Tabelle haben (nicht normalisiert) siteName sollte eigentlich in eine separate Tabelle gehen und nur von SiteVisit referenziert werden