Query for how to add the missing dates in sql

后端 未结 3 1250
臣服心动
臣服心动 2021-01-19 15:18

need to know how to add the date missing with null data in the corresponding field

**05/28/2012    NULL
05/29/2012  NULL
05/30/2012  NULL
05/30/2012  Break          


        
相关标签:
3条回答
  • 2021-01-19 15:58

    Best option is to keep a calender table which contains all the dates for some years that you want to calculate and then left join with that table

    select date,col1
    from calender_table c
    left join 
    your_table t
    on c.[date]=t.[date]
    

    You could create a calender table very easily. There are lots of scripts available in the net. click for examples

    0 讨论(0)
  • 2021-01-19 16:03
    Declare @stDate datetime='05/28/2012'
    declare @eddate datetime='06/14/2012'
    select DATEADD(day,number,@stdate) from master..spt_values where type='P'
    and DATEADD(day,number,@stdate) <= @eddate
    

    Here just join this result with your table on dates column to get the missing dates

    0 讨论(0)
  • 2021-01-19 16:06

    Form a Date Calender with a start and end date range and perform a left join with your table to get the needed result.

    e.g.

    DECLARE @t TABLE(Dt Datetime, Value VARCHAR(20) NULL)
    INSERT INTO @t VALUES
    ('05/28/2012',NULL),
    ('05/29/2012',NULL),
    ('05/30/2012',NULL),('05/30/2012','Break In'),('05/30/2012','Break Out'),
    ('05/31/2012',NULL),
    ('06/03/2012',NULL),('06/03/2012','Break In'),('06/03/2012','Break Out'),('06/03/2012','In Duty'),('06/03/2012','Out Duty'),
    ('06/04/2012',NULL),('06/04/2012','In Duty'),('06/04/2012','Out Duty'),
    ('06/05/2012',NULL),('06/05/2012','Break In'),('06/05/2012','Break Out'),
    ('06/06/2012',NULL),('06/06/2012','Break In'),('06/06/2012','Break Out'),('06/06/2012','In Duty'),('06/06/2012','Out Duty'),
    ('06/07/2012',NULL),('06/07/2012','In Duty'),('06/07/2012','Out Duty'),
    ('06/10/2012',NULL),('06/10/2012','Break Out'),('06/10/2012','In Duty'),('06/10/2012','Out Duty'),
    ('06/11/2012',NULL),('06/11/2012','In Duty'),('06/11/2012','Out Duty'),
    ('06/12/2012',NULL),
    ('06/13/2012',NULL),
    ('06/14/2012',NULL)
    
    
    DECLARE @startDate DATETIME, @endDate DATETIME
    SELECT @startDate = '2012-05-28', @endDate = '2012-06-14' --yyyy-mm-dd
    ;WITH Calender AS (
        SELECT @startDate AS CalanderDate
        UNION ALL
        SELECT CalanderDate + 1 FROM Calender
        WHERE CalanderDate + 1 <= @endDate
    )
    SELECT 
        [Date] = Convert(VARCHAR(10),CalanderDate,101)
        ,Value
    FROM Calender c
    LEFT JOIN @t t 
    ON t.Dt = c.CalanderDate
    

    Result

    Date    Value
    05/28/2012  NULL
    05/29/2012  NULL
    05/30/2012  NULL
    05/30/2012  Break In
    05/30/2012  Break Out
    05/31/2012  NULL
    06/01/2012  NULL
    06/02/2012  NULL
    06/03/2012  NULL
    06/03/2012  Break In
    06/03/2012  Break Out
    06/03/2012  In Duty
    06/03/2012  Out Duty
    06/04/2012  NULL
    06/04/2012  In Duty
    06/04/2012  Out Duty
    06/05/2012  NULL
    06/05/2012  Break In
    06/05/2012  Break Out
    06/06/2012  NULL
    06/06/2012  Break In
    06/06/2012  Break Out
    06/06/2012  In Duty
    06/06/2012  Out Duty
    06/07/2012  NULL
    06/07/2012  In Duty
    06/07/2012  Out Duty
    06/08/2012  NULL
    06/09/2012  NULL
    06/10/2012  NULL
    06/10/2012  Break Out
    06/10/2012  In Duty
    06/10/2012  Out Duty
    06/11/2012  NULL
    06/11/2012  In Duty
    06/11/2012  Out Duty
    06/12/2012  NULL
    06/13/2012  NULL
    06/14/2012  NULL
    

    Hope this helps

    0 讨论(0)
提交回复
热议问题