sql >> Databasteknik >  >> RDS >> Sqlserver

sql-server som visar saknade datum

Jag skulle rekommendera att du använder en table valued function för att få dig alla dagar mellan 2 valda datum som en tabell (Prova i den här fiolen) :

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

(Jag inkluderar en enkel tabelluppställning för enkla copypaste-tester)

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'

nu kan du helt enkelt kontrollera vilka dagar inget besök inträffade när du känner till "gränsdagarna" som detta:

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

Eller om du vill veta alla dagar där någon webbplats inte besöktes kan du använda den här frågan:

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

Bara en sidoanteckning:det verkar som om du har en dubblering i tabellen (inte normaliserad) siteName bör verkligen gå in i en separat tabell och endast refereras från SiteVisit



  1. android.content.res.Resources$NotFoundException:String resurs ID #0x2 Database

  2. Hur lägger man upp en bild från iPhone-appen (i Swift) till MySQL-databasen?

  3. Hur man använder PostgreSQL hstore/json med JdbcTemplate

  4. Oracle XML :Hoppa över Finns inte nod