Как найти все пятницы и праздники между двумя датами - PullRequest
0 голосов
/ 26 января 2012

Таблица:

hDate      Holiday

17/12/2011 National Day
01/01/2012 New Year
....

Из таблицы я хочу узнать общее количество праздников между двумя датами:

Запрос типа:

select count(hdate)
from table1
where hdate between '" & start_date & "' and '" & end_date & "'

Ввод пользователя:

start_date = '16/12/2011' 
end_date = '15/01/2012' 

а также я хочу найти пятницу между 2 датами.

Для поиска по пятницам, как создать запрос?

Ожидаемый результат:

Holiday Friday

2       5

[2] - 2 дня выходных из таблицы1, [5] - 5 дней пятницы

Как это сделать?

Ответы [ 7 ]

6 голосов
/ 26 января 2012

Считается по пятницам между 2 датами:

declare @from datetime= '2012-01-26'  
declare @to datetime  = '2012-01-28'

select datediff(day, -3, @to)/7-datediff(day, -2, @from)/7 

Праздники легко найти, кажется, что эта часть уже освещена.

Я вроде ответил на это раньше.Но не получил кредит:

Как рассчитать количество «вторников» между двумя датами в TSQL?

2 голосов
/ 26 января 2012

Выбор поможет вам:

DECLARE @FROMDATE DATE = '2009-01-07'
DECLARE @TODATE DATE = '2012-01-26'

SELECT COUNT(*) holidays,(select COUNT(*) from table1 where DATEPART(DW, hdate) = 5
AND DT BETWEEN @FROMDATE AND @TODATE ) fridays FROM table1 
WHERE hdate BETWEEN @FROMDATE AND @TODATE
1 голос
/ 26 января 2012

Мы решаем проблему с дополнительным расписанием. Это выглядит так

ID   | Date        | Holiday   | Year    | CalendarWeek | DayName
1    | 17/12/2011  | 1         | 2011    | 50           | Monday 
2    | 18/12/2011  | 0         | 2011    | 50           | Thursday
3    | 19/12/2011  | 0         | 2011    | 50           | Wendsday

С помощью этой таблицы вы можете решить свой вопрос следующим образом

select 
(select count(d.DayName) from date_table as d 
     where d.DayName = 'Friday' and date >= start_date and date <= end_date ),
(select sum(d.Holiday) from date_table as d 
     where date >= start_date and date <= end_date )

Это также должно быть совместимо с SQL Server 2000. И это для SQL Server 2005 и выше:

with tmp(id) as
(
 select id from  from date_table where date >= start_date and date <= end_date
)
select
 (select count(d.DayName) from date_table inner join tmp on tmp.id = id 
     where DayName = 'Friday' ),
 (select sum(d.Holiday) from date_table inner join tmp on tmp.id = id )
1 голос
/ 26 января 2012

См .:

Почему стоит подумать об использовании вспомогательной календарной таблицы?

Календарная таблица может значительно упростить разработку решений для любого бизнеса.модель, которая включает в себя даты.Последнее, что я проверил, это охватывает практически любую бизнес-модель, о которой вы можете подумать, до некоторой степени.К постоянным проблемам, которые требуют многословных, сложных и неэффективных методов, относятся следующие вопросы:

  • Сколько рабочих дней между x и y?
  • Какие бывают даты между вторым вторником марта и первой пятницей апреля?
  • В какую дату следует ожидать прибытия этого отправления?
  • Какими были даты всех пятниц в этом квартале?
  • ...
1 голос
/ 26 января 2012
DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME
SET @StartDate ='16/12/2011' 
SET @EndDate = '15/01/2012' 


SELECT
   (DATEDIFF(dd, @StartDate, @EndDate) + 1)
  -(DATEDIFF(wk, @StartDate, @EndDate) * 2)
  -(CASE WHEN DATENAME(dw, @StartDate) = 'Friday' THEN 1 ELSE 0 END)
1 голос
/ 26 января 2012
select count(Holiday) as holiday
from Table1
where date between start_date AND end_date
1 голос
/ 26 января 2012
  1. В праздничные дни ваш SQL выглядит нормально, у вас просто возникают проблемы с подключением параметров в SQL. Если вы укажете, какой язык программирования вы используете, мы можем помочь здесь. Если вы используете .NET, вы должны использовать параметризованные запросы вместо подстановки строк.

  2. По пятницам смотрите этот вопрос:

...