Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

serwer sql wyświetla brakujące daty

Zalecam użycie table valued function aby uzyskać wszystkie dni pomiędzy 2 wybranymi datami jako tabelę (Wypróbuj w tych skrzypkach) :

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

(Załączam prostą konfigurację stołu dla łatwych testów kopiowania i wklejania)

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'

teraz możesz po prostu sprawdzić, w które dni nie odbyły się żadne wizyty, gdy znasz „dni graniczne”, takie jak:

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

Lub jeśli chcesz wiedzieć wszystkie dni, w których jakakolwiek witryna nie była odwiedzana, możesz użyć tego zapytania:

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

Na marginesie:wygląda na to, że w Twojej tabeli jest trochę zduplikowanych (nie znormalizowanych) siteName powinien naprawdę przejść do osobnej tabeli i odwoływać się do niego tylko z 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. Czy mogę utworzyć widok na moim serwerze bazy danych z innego serwera bazy danych?

  2. Jak używać instrukcji Case do formatowania warunkowego w wybranym zapytaniu — samouczek SQL Server / TSQL, część 116

  3. Jak wykonać wyszukiwanie pełnotekstowe (FTS) za pomocą platformy encji Linq to ADO.NET?

  4. Jak uzyskać czas z formatu DateTime w SQL?

  5. Łączenie wartości kolumn w listę rozdzielaną przecinkami