2015-12-25 4 views
2

мне нужна помощь, чтобы найти общий день в MS SQL 2008 для примера у меня есть таблица курса, как следующийНайти общую дату в MS SQL 2008

+----------+------------+------------+ 
| Course | DateFrom | DateTo | 
+----------+------------+------------+ 
| Course1a | 12/22/2015 | 12/22/2015 | 
| Course1b | 12/22/2015 | 12/22/2015 | 
| Course1c | 12/24/2015 | 12/28/2015 | 
+----------+------------+------------+ 

и праздничный стол, которые хранят праздник, который не означает никакого курса во время в тот день

+-----------+------------+ 
| name | DateFrom | 
+-----------+------------+ 
| Christmas | 12/25/2015 | 
+-----------+------------+ 

в здесь я хочу иметь общее количество дней для course1 быть не менее 5 дней (12/22, 12/24, 12/25 (не считать рождественских праздников), 12/26, 12/27 , 12/28)

ответ

1

Один из способов достижения этого - использовать:

;WITH tally AS 
(
    SELECT TOP 1000 r = ROW_NUMBER() OVER(ORDER BY (SELECT 1)) - 1 
    FROM master..spt_values 
), cte AS 
(
    SELECT Course, DATEADD(d, t.r, c.DateFrom) AS dat 
    FROM #courses c 
    JOIN tally t 
    ON DATEADD(d, t.r, c.DateFrom) <= c.DateTo 
) 
SELECT LEFT(Course, 7) AS Course_Name, 
     COUNT(DISTINCT dat) AS Total_Days 
FROM cte c 
LEFT JOIN #holidays h 
    ON c.dat = h.DateFrom 
WHERE h.DateFrom IS NULL 
GROUP BY LEFT(Course, 7); 

LiveDemo

Выход:

╔═════════════╦════════════╗ 
║ Course_Name ║ Total_days ║ 
╠═════════════╬════════════╣ 
║ Course1  ║   5 ║ 
╚═════════════╩════════════╝ 

Как это работает:

  • tally генерирует номер таблицы (любой метод)
  • cte превращает date_from и date_to в несколько рядов
  • присоединиться к holidays таблице исключить даты праздника
  • GROUP BY LEFT(Course, 7) является обходной путь (ваше имя, конечно, должны быть различны без суффиксов (а, б, в) или вам нужен другой столбец, указывает на то, что 3 курса в сочетании создают один курс)
  • COUNT только DISTINCT даты, чтобы подсчитать общее количество дней
+1

Спасибо за вашу помощь – sylanter

Смежные вопросы