2017-05-18 212 views
0

注意:這是爲加拿大假期:SQL Server - 設置加拿大商務假期日期

我需要用加拿大商業假期填充表格。
我有以下查詢來設置商務假期日期,並且還考慮假期在週末發生假期時移動到下一個工作日。即如果假期發生在星期日,則星期一成爲假期。我還會在平日裏加上一面旗幟,並在當天添加英文說明。

我添加了一些計算列以使作業更容易一些,所有數據創建完畢後再次刪除。我不能丟下桌子;該表可能部分填充,我無法覆蓋現有數據。這是我的問題的根源。由於'是',查詢非常緩慢。

我使用填充表的查詢是:

DECLARE @StartDate DATE = '20000101' 
    ,@EndDate DATE = '21631231'; 

    WITH N10(n) 
      AS (SELECT 1 
       FROM  (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v (n)), 
     N100(n) 
      AS (SELECT 1 
       FROM  N10 
        ,N10 n), 
     N10000(n) 
      AS (SELECT 1 
       FROM  N100 
        ,N100 n), 
     N100000(n) 
      AS (SELECT 1 
       FROM  N10 
        ,N10000 n), 
     N AS (SELECT TOP (DATEDIFF(DAY,@StartDate,@EndDate) + 1) 
         n = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 
       FROM  N100000) 
     INSERT INTO [dbo].[BusinessCalendarDetails2] (BusinessDate,CreatedById,CreatedTime,BusinessCalendarId,IsWeekday, 
              IsHoliday) 
     (SELECT InsertDate,1,CURRENT_TIMESTAMP,1,1,0 
     FROM N 
     CROSS APPLY (SELECT DATEADD (DAY,n,@StartDate)) d (InsertDate) 
     WHERE NOT EXISTS (SELECT 1 FROM [BusinessCalendarDetails2] 
         WHERE [BusinessDate] = InsertDate)); 

這工作,但問題是「WHERE」,以確定如果日期表中已經存在嚴重減緩下來(14分鐘)。所以我想知道如果有人有更快的解決方案來識別已有的日期?

在此先感謝您的幫助。

以下是整個腳本,它工作得很好;其他人可能會覺得它有用。

-- Populate table with business holidays 

    -- If the table is missing add it 
    IF OBJECT_ID('BusinessCalendarDetails2') IS NULL 
     BEGIN 
      CREATE TABLE dbo.BusinessCalendarDetails2 (
       Id BIGINT IDENTITY(1,1) 
          NOT NULL 
       ,BusinessDate [DATE] NOT NULL 
       ,Day AS DAY(BusinessDate) 
       ,Week AS DATEPART(WEEK,BusinessDate) 
       ,[Month] AS MONTH(BusinessDate) 
       ,Quarter AS DATEPART(QUARTER,BusinessDate) 
       ,[Year] AS YEAR(BusinessDate) 
       ,DayOfWeek AS DATEPART(WEEKDAY,BusinessDate) 
       ,CreatedById BIGINT NOT NULL 
       ,CreatedTime DATETIMEOFFSET(7) NOT NULL 
       ,UpdatedById BIGINT NULL 
       ,UpdatedTime DATETIMEOFFSET(7) NULL 
       ,BusinessCalendarId BIGINT NOT NULL 
       ,RowVersion TIMESTAMP NOT NULL 
       ,IsWeekday BIT NOT NULL 
       ,IsHoliday BIT NOT NULL 
       ,Description NVARCHAR(50) 
       ,PRIMARY KEY CLUSTERED (Id ASC) 
        WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON, 
          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) 
      ON [PRIMARY]; 
     END; 

    -- Check if this col exists, 
    IF COL_LENGTH('dbo.BusinessCalendarDetails2','Day') IS NULL 
     BEGIN 
      ALTER TABLE dbo.BusinessCalendarDetails2 
      ADD -- Add calculated fields 
      Day AS DAY(BusinessDate), Week AS DATEPART(WEEK, BusinessDate), [Month] AS MONTH(BusinessDate), Quarter AS DATEPART(QUARTER, BusinessDate), [Year] AS YEAR(BusinessDate), DayOfWeek AS DATEPART(WEEKDAY, BusinessDate); 
     END; 
    GO 

    -- Date range to populate 
    DECLARE @StartDate DATE= '20000101' ,@EndDate DATE= '21631231'; 
    WITH N10(n) 
       AS (SELECT 1 
        FROM  (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) AS v (n)), 
      N100(n) 
       AS (SELECT 1 
        FROM  N10 
          ,N10 AS n), 
      N10000(n) 
       AS (SELECT 1 
        FROM  N100 
          ,N100 AS n), 
      N100000(n) 
       AS (SELECT 1 
        FROM  N10 
          ,N10000 AS n), 
      N AS (SELECT TOP (DATEDIFF(DAY,@StartDate,@EndDate) + 1) 
          n = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 
        FROM  N100000) 
     INSERT INTO dbo.BusinessCalendarDetails2 (BusinessDate,CreatedById,CreatedTime,BusinessCalendarId,IsWeekday, 
                IsHoliday) 
     (SELECT InsertDate,1,CURRENT_TIMESTAMP,1,1,0 
     FROM N 
     CROSS APPLY (SELECT DATEADD (DAY,n,@StartDate)) AS d (InsertDate) 
     WHERE NOT EXISTS (SELECT 1 
          FROM BusinessCalendarDetails2 
          WHERE BusinessDate = InsertDate)); 

    -- Set Descriptions 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  Description = DATENAME(dw,BusinessDate) 
    FROM dbo.BusinessCalendarDetails2; 

    -- Set weekdays 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  IsWeekday = 0,Description = Description + ' Weekend' 
    FROM dbo.BusinessCalendarDetails2 AS c1 
    WHERE DATEPART(WEEKDAY,c1.BusinessDate) IN (1,7); 

    -- New Years Day 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  IsHoliday = 1,Description = Description + ' New Years Day' 
    FROM dbo.BusinessCalendarDetails2 
    WHERE BusinessCalendarDetails2.[Month] = 1 
      AND (SELECT CASE (@@DATEFIRST + DATEPART(DW,CAST(DATEPART(YEAR,BusinessDate) AS VARCHAR) + '-01-01')) % 7 
          WHEN 0 THEN 3 -- SAT 
          WHEN 1 THEN 2 -- Sunday 
          ELSE 1 
         END) = BusinessCalendarDetails2.Day; 

    -- Family Day Day -- 3rd Monday in February 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  IsHoliday = 1,Description = Description + ' Family Day' 
    FROM dbo.BusinessCalendarDetails2 AS c1 
    WHERE c1.[Month] = 2 
      AND c1.DayOfWeek = 2 
      AND c1.Day BETWEEN 15 AND 21; 

    -- Canada Day 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  IsHoliday = 1,Description = Description + ' Canada Day' 
    FROM dbo.BusinessCalendarDetails2 
    WHERE BusinessCalendarDetails2.[Month] = 7 
      AND (SELECT CASE (@@DATEFIRST + DATEPART(DW,CAST(DATEPART(YEAR,BusinessDate) AS VARCHAR) + '-07-01')) % 7 
          WHEN 0 THEN 3 -- SAT 
          WHEN 1 THEN 2 -- Sunday 
          ELSE 1 
         END) = BusinessCalendarDetails2.Day; 

    -- Civic Holiday 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  IsHoliday = 1,Description = Description + ' Civic Holiday' 
    FROM dbo.BusinessCalendarDetails2 AS c1 
    WHERE c1.[Month] = 8 
      AND c1.DayOfWeek = 2 
      AND c1.Day BETWEEN 1 AND 7; 


    -- Good Friday 
    UPDATE BusinessCalendarDetails2 
    SET  IsHoliday = 1,Description = Description + ' Good Friday' 
    FROM dbo.BusinessCalendarDetails2 AS dimdate 
    CROSS APPLY (SELECT dimdate.Year AS y) _y 
    CROSS APPLY (SELECT y/100 AS c,y - 19 * y/19 AS n) _nc 
    CROSS APPLY (SELECT (c - 17)/25 AS k) _k 
    CROSS APPLY (SELECT c - c/4 - (c - k)/3 + 19 * n + 15 AS i1) _i1 
    CROSS APPLY (SELECT i1 - 30 * i1/30 AS i2) _i2 
    CROSS APPLY (SELECT i2 - (i2/28) * (1 - (i2/28) * 29/(i2 + 1) * (21 - n)/11) AS i) _i 
    CROSS APPLY (SELECT y + y/4 + i + 2 - c + c/4 AS j1) _j1 
    CROSS APPLY (SELECT j1 - 7 * j1/7 AS j) _j 
    CROSS APPLY (SELECT i - j AS el) _el 
    CROSS APPLY (SELECT 3 + (el + 40)/44 AS m) _m 
    CROSS APPLY (SELECT el + 28 - 31 * m/4 AS d) _d 
    CROSS APPLY (SELECT DATEFROMPARTS (y,m,d) AS EasterSunday) _Easter 
    WHERE dimdate.BusinessDate = DATEADD(DAY,-2,EasterSunday); 


    -- Easter Sunday 
    UPDATE BusinessCalendarDetails2 
    SET  IsHoliday = 0,Description = Description + ' Easter Sunday' 
    FROM dbo.BusinessCalendarDetails2 AS dimdate 
    CROSS APPLY (SELECT dimdate.Year AS y) _y 
    CROSS APPLY (SELECT y/100 AS c,y - 19 * y/19 AS n) _nc 
    CROSS APPLY (SELECT (c - 17)/25 AS k) _k 
    CROSS APPLY (SELECT c - c/4 - (c - k)/3 + 19 * n + 15 AS i1) _i1 
    CROSS APPLY (SELECT i1 - 30 * i1/30 AS i2) _i2 
    CROSS APPLY (SELECT i2 - (i2/28) * (1 - (i2/28) * 29/(i2 + 1) * (21 - n)/11) AS i) _i 
    CROSS APPLY (SELECT y + y/4 + i + 2 - c + c/4 AS j1) _j1 
    CROSS APPLY (SELECT j1 - 7 * j1/7 AS j) _j 
    CROSS APPLY (SELECT i - j AS el) _el 
    CROSS APPLY (SELECT 3 + (el + 40)/44 AS m) _m 
    CROSS APPLY (SELECT el + 28 - 31 * m/4 AS d) _d 
    CROSS APPLY (SELECT DATEFROMPARTS (y,m,d) AS EasterSunday) _Easter 
    WHERE dimdate.BusinessDate = EasterSunday; 


    -- Labour Day -- first Monday of September 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  IsHoliday = 1,Description = Description + ' Labour Day' 
    FROM dbo.BusinessCalendarDetails2 AS c1 
    WHERE c1.[Month] = 9 
      AND c1.DayOfWeek = 2 
      AND c1.Day BETWEEN 1 AND 7; 

    -- Set Thanksgiving 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  IsHoliday = 1,Description = Description + ' Thanksgiving' 
    FROM dbo.BusinessCalendarDetails2 AS c1 
    WHERE c1.[Month] = 10 
      AND c1.DayOfWeek = 2 
      AND c1.Day BETWEEN 8 AND 14; 

    ---- Christmas 
    UPDATE dbo.BusinessCalendarDetails2 
    SET  IsHoliday = 1,Description = Description + ' Christmas Holidays' 
    FROM dbo.BusinessCalendarDetails2 
    WHERE [Month] = 12 
      AND Day BETWEEN 26 AND 28 
      AND (DATEPART(WEEKDAY,CAST(DATEPART(YEAR,BusinessDate) AS VARCHAR) + '-12-25') IN (1,7)  -- Is Christmas on a weekend this year 
       OR DATEPART(WEEKDAY,CAST(DATEPART(YEAR,BusinessDate) AS VARCHAR) + '-12-26') IN (1,7))  -- Is Boxingday on a weekend this year 
      AND DATEPART(dw,BusinessDate) <> 4 -- NOT ON Wednesday! 
      AND DATEPART(DAY,(SELECT CASE (@@DATEFIRST + DATEPART(dw,BusinessDate)) % 7 
              WHEN 0 THEN DATEADD(DAY,2,BusinessDate) -- Saturday 
              WHEN 1 THEN DATEADD(DAY,1,BusinessDate) -- Sunday 
              ELSE BusinessDate 
             END AS Weekday)) BETWEEN 26 
                 AND  28 
      OR [Month] = 12 -- Is christmas a week day? 
      AND Day BETWEEN 25 AND 26 
      AND IsWeekday = 1; 
    GO 

    -- Return table to orig state 
    ALTER TABLE dbo.BusinessCalendarDetails2 DROP COLUMN Day, Week, [Month], Quarter, [Year], DayOfWeek; 
+0

你爲什麼不作出[BusinessDate]作爲唯一 –

+0

這是一個好主意,要快得多,但我無法改變的模式 – GDutton

回答

1

如果BusinessDate上沒有索引並且表格足夠大,那肯定會減慢速度。如果它被編入索引,則可能需要重新編譯/重新組織它,甚至只需重做統計信息。

否則,根據您的磁盤,將不同的BusinessDate列值插入帶有索引的臨時表並將其與之進行比較可能會更快。

這可能是很多事情。如果你還沒有,你應該看看你的查詢的實際執行計劃和統計數據,以更好地瞭解究竟是什麼導致了這個問題。

+0

這是一個很好理念!!我將它切換到使用臨時表,然後插入錯過匹配...運行時= 8秒! – GDutton

0

這是使用臨時表的最後答案運行

-- Populate table with business holidays 

    CREATE TABLE #BusCalDet (
     Id BIGINT IDENTITY(1,1) 
        NOT NULL 
     ,BusinessDate [DATE] NOT NULL 
     ,Day AS DAY(BusinessDate) 
     ,Week AS DATEPART(WEEK,BusinessDate) 
     ,[Month] AS MONTH(BusinessDate) 
     ,Quarter AS DATEPART(QUARTER,BusinessDate) 
     ,[Year] AS YEAR(BusinessDate) 
     ,DayOfWeek AS DATEPART(WEEKDAY,BusinessDate) 
     ,CreatedById BIGINT NOT NULL 
     ,CreatedTime DATETIMEOFFSET(7) NOT NULL 
     ,UpdatedById BIGINT NULL 
     ,UpdatedTime DATETIMEOFFSET(7) NULL 
     ,BusinessCalendarId BIGINT NOT NULL 
     ,RowVersion TIMESTAMP NOT NULL 
     ,IsWeekday BIT NOT NULL 
     ,IsHoliday BIT NOT NULL 
     ,Description NVARCHAR(50) 
     ,PRIMARY KEY CLUSTERED (Id ASC) 
      WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) 
    ON [PRIMARY]; 


    -- Date range to populate 
    DECLARE @StartDate DATE= '20000101' 
     ,@EndDate DATE= '21631231'; 
    WITH N10(n) 
       AS (SELECT 1 
        FROM  (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) AS v (n)), 
      N100(n) 
       AS (SELECT 1 
        FROM  N10 
          ,N10 AS n), 
      N10000(n) 
       AS (SELECT 1 
        FROM  N100 
          ,N100 AS n), 
      N100000(n) 
       AS (SELECT 1 
        FROM  N10 
          ,N10000 AS n), 
      N AS (SELECT TOP (DATEDIFF(DAY,@StartDate,@EndDate) + 1) 
          n = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 
        FROM  N100000) 
     INSERT INTO #BusCalDet (BusinessDate,CreatedById,CreatedTime,BusinessCalendarId,IsWeekday,IsHoliday) 
     SELECT InsertDate,1,CURRENT_TIMESTAMP,1,1,0 
     FROM N 
     CROSS APPLY (SELECT DATEADD (DAY,n,@StartDate)) AS d (InsertDate); 


    -- Set Descriptions 
    UPDATE #BusCalDet 
    SET  Description = DATENAME(dw,BusinessDate) 
    FROM #BusCalDet; 

    -- Set weekdays 
    UPDATE #BusCalDet 
    SET  IsWeekday = 0,Description = Description + ' Weekend' 
    FROM #BusCalDet AS c1 
    WHERE DATEPART(WEEKDAY,c1.BusinessDate) IN (1,7); 

    -- New Years Day 
    UPDATE #BusCalDet 
    SET  IsHoliday = 1,Description = Description + ' New Years Day' 
    FROM #BusCalDet 
    WHERE #BusCalDet.[Month] = 1 
      AND (SELECT CASE (@@DATEFIRST + DATEPART(DW,CAST(DATEPART(YEAR,BusinessDate) AS VARCHAR) + '-01-01')) 
          % 7 
          WHEN 0 THEN 3 -- SAT 
          WHEN 1 THEN 2 -- Sunday 
          ELSE 1 
         END) = #BusCalDet.Day; 

    -- Family Day Day -- 3rd Monday in February 
    UPDATE #BusCalDet 
    SET  IsHoliday = 1,Description = Description + ' Family Day' 
    FROM #BusCalDet AS c1 
    WHERE c1.[Month] = 2 
      AND c1.DayOfWeek = 2 
      AND c1.Day BETWEEN 15 AND 21; 

    -- Canada Day 
    UPDATE #BusCalDet 
    SET  IsHoliday = 1,Description = Description + ' Canada Day' 
    FROM #BusCalDet 
    WHERE #BusCalDet.[Month] = 7 
      AND (SELECT CASE (@@DATEFIRST + DATEPART(DW,CAST(DATEPART(YEAR,BusinessDate) AS VARCHAR) + '-07-01')) 
          % 7 
          WHEN 0 THEN 3 -- SAT 
          WHEN 1 THEN 2 -- Sunday 
          ELSE 1 
         END) = #BusCalDet.Day; 

    -- Civic Holiday 
    UPDATE #BusCalDet 
    SET  IsHoliday = 1,Description = Description + ' Civic Holiday' 
    FROM #BusCalDet AS c1 
    WHERE c1.[Month] = 8 
      AND c1.DayOfWeek = 2 
      AND c1.Day BETWEEN 1 AND 7; 


    -- Good Friday 
    UPDATE #BusCalDet 
    SET  IsHoliday = 1,Description = Description + ' Good Friday' 
    FROM #BusCalDet AS dimdate 
    CROSS APPLY (SELECT dimdate.Year AS y) _y 
    CROSS APPLY (SELECT y/100 AS c,y - 19 * y/19 AS n) _nc 
    CROSS APPLY (SELECT (c - 17)/25 AS k) _k 
    CROSS APPLY (SELECT c - c/4 - (c - k)/3 + 19 * n + 15 AS i1) _i1 
    CROSS APPLY (SELECT i1 - 30 * i1/30 AS i2) _i2 
    CROSS APPLY (SELECT i2 - (i2/28) * (1 - (i2/28) * 29/(i2 + 1) * (21 - n)/11) AS i) _i 
    CROSS APPLY (SELECT y + y/4 + i + 2 - c + c/4 AS j1) _j1 
    CROSS APPLY (SELECT j1 - 7 * j1/7 AS j) _j 
    CROSS APPLY (SELECT i - j AS el) _el 
    CROSS APPLY (SELECT 3 + (el + 40)/44 AS m) _m 
    CROSS APPLY (SELECT el + 28 - 31 * m/4 AS d) _d 
    CROSS APPLY (SELECT DATEFROMPARTS (y,m,d) AS EasterSunday) _Easter 
    WHERE dimdate.BusinessDate = DATEADD(DAY,-2,EasterSunday); 


    -- Easter Sunday 
    UPDATE #BusCalDet 
    SET  IsHoliday = 0,Description = Description + ' Easter Sunday' 
    FROM #BusCalDet AS dimdate 
    CROSS APPLY (SELECT dimdate.Year AS y) _y 
    CROSS APPLY (SELECT y/100 AS c,y - 19 * y/19 AS n) _nc 
    CROSS APPLY (SELECT (c - 17)/25 AS k) _k 
    CROSS APPLY (SELECT c - c/4 - (c - k)/3 + 19 * n + 15 AS i1) _i1 
    CROSS APPLY (SELECT i1 - 30 * i1/30 AS i2) _i2 
    CROSS APPLY (SELECT i2 - (i2/28) * (1 - (i2/28) * 29/(i2 + 1) * (21 - n)/11) AS i) _i 
    CROSS APPLY (SELECT y + y/4 + i + 2 - c + c/4 AS j1) _j1 
    CROSS APPLY (SELECT j1 - 7 * j1/7 AS j) _j 
    CROSS APPLY (SELECT i - j AS el) _el 
    CROSS APPLY (SELECT 3 + (el + 40)/44 AS m) _m 
    CROSS APPLY (SELECT el + 28 - 31 * m/4 AS d) _d 
    CROSS APPLY (SELECT DATEFROMPARTS (y,m,d) AS EasterSunday) _Easter 
    WHERE dimdate.BusinessDate = EasterSunday; 


    -- Labour Day -- first Monday of September 
    UPDATE #BusCalDet 
    SET  IsHoliday = 1,Description = Description + ' Labour Day' 
    FROM #BusCalDet AS c1 
    WHERE c1.[Month] = 9 
      AND c1.DayOfWeek = 2 
      AND c1.Day BETWEEN 1 AND 7; 

    -- Set Thanksgiving 
    UPDATE #BusCalDet 
    SET  IsHoliday = 1,Description = Description + ' Thanksgiving' 
    FROM #BusCalDet AS c1 
    WHERE c1.[Month] = 10 
      AND c1.DayOfWeek = 2 
      AND c1.Day BETWEEN 8 AND 14; 

    ---- Christmas 
    UPDATE #BusCalDet 
    SET  IsHoliday = 1,Description = Description + ' Christmas Holidays' 
    FROM #BusCalDet 
    WHERE [Month] = 12 
      AND Day BETWEEN 26 AND 28 
      AND (DATEPART(WEEKDAY,CAST(DATEPART(YEAR,BusinessDate) AS VARCHAR) + '-12-25') IN (1,7)  -- Is Christmas on a weekend this year 
       OR DATEPART(WEEKDAY,CAST(DATEPART(YEAR,BusinessDate) AS VARCHAR) + '-12-26') IN (1,7))  -- Is Boxingday on a weekend this year 
      AND DATEPART(dw,BusinessDate) <> 4 -- NOT ON Wednesday! 
      AND DATEPART(DAY,(SELECT CASE (@@DATEFIRST + DATEPART(dw,BusinessDate)) % 7 
              WHEN 0 THEN DATEADD(DAY,2,BusinessDate) -- Saturday 
              WHEN 1 THEN DATEADD(DAY,1,BusinessDate) -- Sunday 
              ELSE BusinessDate 
             END AS Weekday)) BETWEEN 26 
                 AND  28 
      OR [Month] = 12 -- Is christmas a week day? 
      AND Day BETWEEN 25 AND 26 
      AND IsWeekday = 1; 

    -- Match orig table Schema 
    ALTER TABLE #BusCalDet DROP COLUMN Day, Week, [Month], Quarter, [Year], DayOfWeek; 

     -- Insert in to the main table' 
    INSERT INTO dbo.BusinessCalendarDetails (BusinessDate,CreatedById,CreatedTime,BusinessCalendarId,IsWeekday, 
               IsHoliday,[Description]) 
     -- Find Rows that are missing 
    SELECT DT.BusinessDate,DT.CreatedById,DT.CreatedTime,DT.BusinessCalendarId,DT.IsWeekday,DT.IsHoliday, 
      DT.[Description] 
    FROM #BusCalDet DT 
    LEFT JOIN BusinessCalendarDetails ON BusinessCalendarDetails.BusinessDate = DT.BusinessDate 
    WHERE BusinessCalendarDetails.Id IS NULL 
    ORDER BY DT.BusinessDate;-- id