sql >> Database teknologi >  >> RDS >> Sqlserver

sql-server viser manglende datoer

Jeg vil anbefale dig at bruge en table valued function for at få dig alle dage imellem 2 udvalgte datoer som et bord (Prøv det i denne violin) :

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

(Jeg inkluderer en simpel tabelopsætning til nemme copypaste-tests)

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 blot tjekke, hvilke dage der ikke har været besøg, når du kender "grænsedagene", såsom denne:

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 hvis du gerne vil vide alle dage, hvor et websted ikke blev besøgt, kan du bruge denne forespørgsel:

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

Bare en sidebemærkning:det ser ud til, at du har en vis duplikering i din tabel (ikke normaliseret) siteName burde virkelig gå ind i en separat tabel og kun refereres fra SiteVisit



  1. mysql vælg antallet af poster for hver måned

  2. VÆLG mange til mange tabeller i én forespørgsel

  3. Opdater flere tabeller i SQL Server ved hjælp af INNER JOIN

  4. ORA-00054:ressource optaget og anskaffelse med NOWAIT angivet eller timeout udløbet