Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как узнать количество дней между датами исключив выходные?  [new]
TwoRS
Member

Откуда:
Сообщений: 113
Здраствуйте, есть таблица IdStudenta/IdSpravki/Nachalo/Konec/Primechanie
Как мне просчитать количество дней со справками у студента, зная начало и конец справки, и при этом исключив выходные, а лучше еше, например создать таблицу "праздники" и вносить данные типа 8.03.2012= 8 марта и т.д. и что б эти даты исключались тоже.
Вообщем хочу получить ответ вроде
idstudent/idspravki/Count
1/1/ 20 (например 1й студент по 1й справке 20 дней пропуска).

И вариант посложнее:
если будет пересечение справок, например одна справка 1.1.2012-20.1.2012 -примечание-Бронхит, а другая 12.1.2012-28.1.2012 примечание -участие в конференции и надо отобразить в другом виде, например
idstudenta/idspravki/date/primechanie
1/ 1/ 1.1.2012/Бронхит
1/ 1/ 2.1.2012/Бронхит
.....
1/ 1/ 12.1.2012/Бронхит
1/ 2/ 12.1.2012/УЧАСТИЕ В КОНФЕРЕНЦИИ
...
Как сделать запрос, что б получить такой ответ?
4 авг 12, 02:17    [12961537]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать количество дней между датами исключив выходные?  [new]
aleks2
Guest
declare @t table(IdStudenta int, IdSpravki int, Nachalo datetime, Konec datetime, Primechanie nvarchar(4000))
declare @prazdniki_vyhodnye table (d datetime primary key clustered)

select *, datediff(day, Nachalo, Konec) - (select count(*) from @prazdniki_vyhodnye where d between Nachalo and Konec)
  from @t


ЗЫ. Что ты там просишь с пересечением - я не въехал.
4 авг 12, 06:34    [12961608]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать количество дней между датами исключив выходные?  [new]
TwoRS
Member

Откуда:
Сообщений: 113
да просто я хотел сказать, что в один день может быть несколько справок, но это,как я понял, никак не влияет на запрос...
4 авг 12, 19:57    [12962705]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать количество дней между датами исключив выходные?  [new]
Читатель неместный
Guest
Крайне необходима табличка "календарь" ....полный, все дни - праздничные, предпраздничные, рабочие и выходные дни нужно признаком отметить - то есть (дата, признак). Воскресенье может быть рабочим и наоборот.
Такая табличка "крайне" нужна не для этой задачи а вообще много где может использоваться.
Есть смысл держать там даты за пять прошедших и будущих лет.
По такой табличке очень просто можно получить список варианта 2- нужен только порядок приоритета видов справок.
(и не болел он вовсе 12 числа бронхитом )
5 авг 12, 00:35    [12963493]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать количество дней между датами исключив выходные?  [new]
Yasha123
Member

Откуда:
Сообщений: 1973
оно?
select DATEADD(dd, number, @calend_b) as dt
from master..spt_values
where type = 'P' and number between 0 and DATEDIFF(DD,@calend_b,@calend_e)
)
select t.IdStudenta,
       t.IdSpravki,
       cast(c.dt as DATE) as dt,
       t.Primechanie
from calend c join @t t on  c.dt between t.Nachalo and t.Konec
order by t.IdStudenta,
       cast(c.dt as DATE),
       t.IdSpravki


+
IdStudenta IdSpravki dt Primechanie
1 1 2012-01-01 Бронхит
1 1 2012-01-02 Бронхит
1 1 2012-01-03 Бронхит
1 1 2012-01-04 Бронхит
1 1 2012-01-05 Бронхит
1 1 2012-01-06 Бронхит
1 1 2012-01-07 Бронхит
1 1 2012-01-08 Бронхит
1 1 2012-01-09 Бронхит
1 1 2012-01-10 Бронхит
1 1 2012-01-11 Бронхит
1 1 2012-01-12 Бронхит
1 2 2012-01-12 участие в конференции
1 1 2012-01-13 Бронхит
1 2 2012-01-13 участие в конференции
1 1 2012-01-14 Бронхит
1 2 2012-01-14 участие в конференции
1 1 2012-01-15 Бронхит
1 2 2012-01-15 участие в конференции
1 1 2012-01-16 Бронхит
1 2 2012-01-16 участие в конференции
1 1 2012-01-17 Бронхит
1 2 2012-01-17 участие в конференции
1 1 2012-01-18 Бронхит
1 2 2012-01-18 участие в конференции
1 1 2012-01-19 Бронхит
1 2 2012-01-19 участие в конференции
1 1 2012-01-20 Бронхит
1 2 2012-01-20 участие в конференции
1 2 2012-01-21 участие в конференции
1 2 2012-01-22 участие в конференции
1 2 2012-01-23 участие в конференции
1 2 2012-01-24 участие в конференции
1 2 2012-01-25 участие в конференции
1 2 2012-01-26 участие в конференции
1 2 2012-01-27 участие в конференции
1 2 2012-01-28 участие в конференции
5 авг 12, 01:03    [12963560]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать количество дней между датами исключив выходные?  [new]
TwoRS
Member

Откуда:
Сообщений: 113
Спасибо,
с таблицей праздников я понял, я просто напишу not in (select date ....) и их отсею,
а как узнать по дате, является ли она субботой или воскресеньем? или это надо в с# как-то узнать и сформировать строку, и ее вставить вместе с предидущим запросом на отсеивание, или есть способ сделать через sql?
5 авг 12, 10:58    [12964013]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать количество дней между датами исключив выходные?  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
TwoRS,

Есть функция DATEPART, вам нужно определить weekday, для субботы=6. Может понадобиться выставить SET DATEFIRST 1 - начало недели в понедельник.
5 авг 12, 11:34    [12964069]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать количество дней между датами исключив выходные?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Подскажите как узнать, день недели?
SELECT
 CASE (DATEPART(WEEKDAY,GETDATE())+@@DATEFIRST)%7
  WHEN 2 THEN 'понедельник'
  WHEN 3 THEN 'вторник'
  WHEN 4 THEN 'среда'
  WHEN 5 THEN 'четверг'
  WHEN 6 THEN 'пятница'
  WHEN 0 THEN 'суббота'
  WHEN 1 THEN 'воскресенье'
 END;
Другой способ:
SELECT
 CASE DATEDIFF(DAY,0,GETDATE())%7
  WHEN 0 THEN 'понедельник'
  WHEN 1 THEN 'вторник'
  WHEN 2 THEN 'среда'
  WHEN 3 THEN 'четверг'
  WHEN 4 THEN 'пятница'
  WHEN 5 THEN 'суббота'
  WHEN 6 THEN 'воскресенье'
 END;
5 авг 12, 14:53    [12964501]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать количество дней между датами исключив выходные?  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
1) формируете список дат между дувумя задаными при помощи рекурсивного CTE как формируются последовательности чисел
2) создаёте табличку а-ля "производтвенный календарь" в которой хранятся либо все дни как в календаре (так я предпочитаю) либо только выходные (тогда каждый раз надо вычисления делать), заполняете её. По дефолту могут быть заполнены рабочими/выходными по дням недели (и потом отредактированы согласно производтвенному календарю)
3) в зависимости от логики таблицы делейте к ней запрос between, либо формированием списка дат и исключением выходных

Рассматривайте "день" как тип сущности, даты - как экземпляры. На него даже можно вполне ссылаться. И подчёркиваю что это "выходные календаря" и табличка а-ля tCalendar, а не "День сотрудника" (это отдельная сущность и рабочий/выходной сотрудника может не зависить от дня в календаре).
6 авг 12, 11:26    [12966744]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить