sql >> データベース >  >> RDS >> Sqlserver

行方不明の日付を表示するSQLサーバー

    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. PHP+MySQLを使用したutf-8エンコーディングの問題

    2. MySQLSUMクエリは非常に遅い

    3. Java EEアプリケーションでデータベース接続のリークを確認するにはどうすればよいですか?

    4. 同様の演算子を使用せずに、複数の単一または参照のデータを取得する