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

Откуда:
Сообщений: 4
Стоит у нас амечательный продукт BioTime с таким богатым функционалом и отзывчивой поддержкой, что приходится извращатся самостоятельно.
Суть программы - регистрация факта ухода и прихода сотрудника. База крутится на MS SQL 2000.
Сейчас встала задача - учёт ранних уходов с работы. Задача была бы простой, если бы не наш график работы - в предпраздничный день рабочий день укорачивают на час.
Итого, надо "искать" праздники.
Решил сделать просто. Если в день пришло менее, чем 6 сотрудников, значит или праздник или выходной. Получился следующий запрос:

DECLARE @QD INT --количество вычитаемых дней
DECLARE @PD DATETIME --дата крайнего рабочего дня
DECLARE @D DATETIME --текущая дата

SET @D=CONVERT(varchar(8), GETDATE(), 112) --текущая дата
SET @QD = 1 --количество вычитаемых дней от текущего дня
	WHILE (SELECT COUNT(RegisteredEventId)
		    FROM Event
		    WHERE EventDate LIKE (DATEADD(DAY,(-@QD),@D))
		     ) > 6 --подсчёт количества событий во вчерашний день
	  BEGIN			
	    SET @QD=@QD+1
	  END

SET @PD=DATEADD(DAY,(-@QD),@D) --дата крайнего рабочего дня
Но запрос упорно выдаёт вчерашний день, хотя вчера был выходной.
Если выполнить подсчёт количества событий отдельно
SELECT COUNT(RegisteredEventId)
FROM Event
WHERE EventDate LIKE (DATEADD(DAY,(-@QD),@D)
выдаёт ноль.
Что я делаю неправильно? Помогите, плз! :-)
6 июл 09, 19:18    [7383069]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
проходящий.
Guest
Mihei_
Что я делаю неправильно? Помогите, плз! :-)
Давно уже такие задачи на T-SQL решаются созданием таблицы-календаря. Обсосано уже не единожды и со всех стороно. Поищите.
6 июл 09, 19:30    [7383113]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
Crimean
Member

Откуда:
Сообщений: 13148
проходящий.
Mihei_
Что я делаю неправильно? Помогите, плз! :-)
Давно уже такие задачи на T-SQL решаются созданием таблицы-календаря. Обсосано уже не единожды и со всех стороно. Поищите.


+1
6 июл 09, 19:31    [7383122]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Mihei_
Если в день пришло менее, чем 6 сотрудников, значит или праздник или выходной.
Ну, Вы даёте!
6 июл 09, 21:25    [7383427]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
Нектотам
Guest
Mihei_,

Просто интересно, кого вы автоматизируете, что "последний" стал "крайним"? ;)
7 июл 09, 06:25    [7383898]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
Mihei_
Member

Откуда:
Сообщений: 4
Всем спасибо, но вопрос в другом :-)
Вопрос в проблеме в приведённом коде... Про таблицу с праздниками я читал, но это не выход, т.к. такой таблицы нет, а создавать её - это порождение лишних сущностей :-)) Хватит того, что лишний SQL запрос есть.
Так что прошу отвечать по существу :-)
7 июл 09, 10:40    [7384578]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
проходящий.
Guest
Mihei_
Всем спасибо, но вопрос в другом :-)
Вопрос в проблеме в приведённом коде... Про таблицу с праздниками я читал, но это не выход, т.к. такой таблицы нет, а создавать её - это порождение лишних сущностей :-)) Хватит того, что лишний SQL запрос есть.
Так что прошу отвечать по существу :-)
Батенька! Сервер заточен для работы с таблицами как с множеством. И потому Ваши попытки позаписного вычисления и есть "не по существу". Существо тут не такое, как в языках программирования общего назначения. И одна небольшая табличка займет намного меньше ресурсов сервера по сравнению с циклами.
7 июл 09, 10:56    [7384708]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
А создать вьюху - "праздничные дни" не судьба?
CREATE VIEW Holidays 
as
SELECT EventDate
  FROM Event
GROUP BY EventDate
  HAVING COUNT(*) <6

ИМХО. Вы выбрали порочный подход.
7 июл 09, 11:01    [7384754]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
Mihei_
Стоит у нас амечательный продукт BioTime с таким богатым функционалом и отзывчивой поддержкой, что приходится извращатся самостоятельно.
Суть программы - регистрация факта ухода и прихода сотрудника. База крутится на MS SQL 2000.
Сейчас встала задача - учёт ранних уходов с работы. Задача была бы простой, если бы не наш график работы - в предпраздничный день рабочий день укорачивают на час.
Итого, надо "искать" праздники.
Решил сделать просто. Если в день пришло менее, чем 6 сотрудников, значит или праздник или выходной. Получился следующий запрос:

DECLARE @QD INT --количество вычитаемых дней
DECLARE @PD DATETIME --дата крайнего рабочего дня
DECLARE @D DATETIME --текущая дата

SET @D=CONVERT(varchar(8), GETDATE(), 112) --текущая дата
SET @QD = 1 --количество вычитаемых дней от текущего дня
	WHILE (SELECT COUNT(RegisteredEventId)
		    FROM Event
		    WHERE EventDate LIKE (DATEADD(DAY,(-@QD),@D))
		     ) > 6 --подсчёт количества событий во вчерашний день
	  BEGIN			
	    SET @QD=@QD+1
	  END

SET @PD=DATEADD(DAY,(-@QD),@D) --дата крайнего рабочего дня
Но запрос упорно выдаёт вчерашний день, хотя вчера был выходной.
Если выполнить подсчёт количества событий отдельно
SELECT COUNT(RegisteredEventId)
FROM Event
WHERE EventDate LIKE (DATEADD(DAY,(-@QD),@D)
выдаёт ноль.
Что я делаю неправильно? Помогите, плз! :-)


похоже условие while пропускает рабочие дни (>6) и соответственно выдает только выходные
если поставить <=6 то будет пропускать выходные и выдавать рабочие :)

а вообще если не делать табличку с праздниками то вьюха выше имхо удобнее :)
7 июл 09, 12:31    [7385418]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4331
А если очень выходной день, и на работу припёрлись все сотрудники, чтобы это дело отметить? ;)
7 июл 09, 13:38    [7385950]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4331
Заходил на страничку с анекдотами? ))))
7 июл 09, 13:40    [7385966]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
Mihei_
Member

Откуда:
Сообщений: 4
--__Александр__--,

Спасибо! Про VIEW и не подумал.
Нет ещё у меня SQL подхода к решению задачки :-))
7 июл 09, 13:44    [7385999]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
Mihei_
Member

Откуда:
Сообщений: 4
Charles Weyland
Заходил на страничку с анекдотами? ))))

Ну это без выдумки запостили :-))) можно было бы число 6 обыграть

В выходные могут прийти люди, например я, т.к. не всё можно с серваками в будни творить, соответвенно и факт прихода отметится. Но вот больше 6, (а на самом деле это 3 человека, т.к. это факт прихода и ухода) вряд ли соберётся.
Больше трёх, по выходным, не собираться!
7 июл 09, 13:58    [7386134]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
Так попробуйте, выводит все "праздничные" дни

SELECT T.*
FROM 
(SELECT EventDate
FROM Event
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, EventDate), 0)
HAVING COUNT(RegisteredEventId) > 6) T -- Все праздничные дни
7 июл 09, 13:59    [7386139]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
tusha
Member

Откуда:
Сообщений: 122
уго.... например в конторе прошло массовое заболевание свинячим грипом и в результате пришло 5 человек.... - т.е. Ваша система будет бочить...
таблица Календарь самое правильное решение, вместо того чтоб реализовывать сложную логику поверки. а если в Вашем славном городе мер постановит что каждая 14 пятница года выходной и праздник??
7 июл 09, 16:29    [7387463]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
stimpi
Так попробуйте, выводит все "праздничные" дни

SELECT T.*
FROM 
(SELECT EventDate
FROM Event
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, EventDate), 0)
HAVING COUNT(RegisteredEventId) > 6) T -- Все праздничные дни

ето при усливи что у вас первый день в неделе не воскресение :))
7 июл 09, 16:31    [7387488]     Ответить | Цитировать Сообщить модератору
 Re: крайний рабочий день через WHILE  [new]
stimpi
Member

Откуда: Киев, Украина
Сообщений: 662
Maxx
ето при усливи что у вас первый день в неделе не воскресение :))

Где вы увидели про первый день воскресенье ?
запрос просто выводит дни, где пришли на работу больше 6ти человек (условие в начале топика).
8 июл 09, 10:36    [7389913]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить