2013-04-21 4 views
-2

У меня есть таблица с именем holiday_master, в которой три столбца указаны с именем from_date, to_date и duration. Теперь, когда пользователь вводит диапазон дат, дайте daterange1 и daterange2 на основе праздничного стола, напишите sql, чтобы найти количество праздников. Он будет включать как from_date, так и to_date.Поиск количества праздников между заданным диапазоном дат в sql

Для например FROM_DATE длительности to_date 2012/08/01 2012/08/03 3 2012/09/17 2012/09/24 8

Пользователь входит: 2012/07/30 в 2012/08/02 (Количество праздников: 2) 2012/09/20 до 2012/09/29 (Количество праздников: 5)

+0

Как вы относитесь к перекрывающимся праздникам? – HABO

ответ

1

следующий запрос должен работать:

select coalesce(sum(datediff(day, 
        (case when h.from_date < t.fromdate then t.fromdate else h.from_date end), 
        (case when t.to_date > t.todate then t.todate else h.to_date end) 
        ), 0) 
from (select @daterange1 as fromdate, @daterange2 as todate) const left outer join 
    holidays h 
    on h.from_date <= todate and h.to_date >= from_date; 

Вот логика. Во-первых, я просто поместил константы в постоянную таблицу для удобства (ограничивает стресс клавишей «@»). Затем оставшийся запрос присоединяется к таблице праздников - необходимо, если в этот период нет праздников.

Затем он выполняет логику, где сравнивает перекрывающиеся периоды времени. Если начало праздника предшествует периоду времени, сделайте начало начала периода времени. То же самое в конце. Затем просто добавьте все эти периоды времени.

В зависимости от того, как обрабатывается «to_date», вам может потребоваться добавить «1» в период. Является ли «to_date» включенным в качестве праздника или нет. Если он включен в качестве праздника, то логика такова:

select coalesce(sum(1+datediff(day, 
        (case when h.from_date < t.fromdate then t.fromdate else h.from_date end), 
        (case when t.to_date > t.todate then t.todate else h.to_date end) 
        ), 0) 
Смежные вопросы