Работа с рабочими днями.

DeColo®es

Наконец-то собрался с силами, написал небольшую статью на тему оперрирования рабочими днями в SQL Server.
5 ответов

DeColo®es

1. Непонятно зачем эти сложные манипуляции с индексом в тригере. По-моему он вообще не нужен.Запрос вида вполне адекватно и быстро выполняется(index seek + stream aggregate)n- рабочий день после даты
DECLARE @date datetime 
 ,@n INT 

SELECT MAX(z.DateValue)
FROM 
 (
 SELECT TOP(@n + <b>1</b>) 
 c.DateValue
 FROM dbo.Calendar c
 WHERE c.DateValue >= DATEADD(dd, DATEDIFF(dd,CAST(<b>0</b> AS datetime), @date), CAST(<b>0</b> AS DATETIME))
 AND 
 c.IsWorkday = CAST(<b>1</b> AS BIT)

 ORDER BY c.DateValue
 ) AS [z]
TOP(@n + 1) + >= - для гарантии если введенная дата выходной. 2. Лучше ваши скалярные функции заменить инлайновыми( в разы бысрее будет). Ну да, придется outer apply писать. В целом интересно почитать кто как получает рабочии дни.


DeColo®es

1. Непонятно зачем эти сложные манипуляции с индексом в тригере. По-моему он вообще не нужен.Запрос вида вполне адекватно и быстро выполняется(index seek + stream aggregate)
Если уж Вы замечаете разницу в inline и скалярных функциях, то можно заметить и разницу в необходимости делать агрегат по сравнению с просто поиском по индексу. ;) Хотя в случае небольших периодов и разница конечно будет небольшой.Но для сотен запросов в секунду она накаплавается в существенные цифры.


DeColo®es

DeColo®es,В приведённой статье я ничего не увидел насчёт государственных праздников, нерабочими отмечены только субботы и воскресенья. Или я где-то что-то пропустил?


DeColo®es

Сид,Прошу прощения за ответ, не у меня спрашивали. Основная задача изложенного выше - это различные расчеты с учетом рабочих дней. Календарь заполнялся так для примера описанного. Пользователь в любой момент может сделать любой день как рабочим так и нет.(IsWorking) А тригер перестроит индекс.


DeColo®es

В приведённой статье я ничего не увидел насчёт государственных праздников, нерабочими отмечены только субботы и воскресенья. Или я где-то что-то пропустил?
Если только Вы предложите алгоритм определения государственных праздников наперед в 2015 году... Да еще и с учетом того, что они в разных странах несколько различаются... Лосина - да, все верно, после наполнения нужно только проадейтить поле IsWorkday в соответствии с последними постановлениями правительства и приказами "по предприятию". WotkIndex изменится "сам собой" в триггере.