SQL Server: рассчитать рабочее время - PullRequest
0 голосов
/ 20 января 2011

Как я могу рассчитать рабочее время в SQL Server между двумя datetime переменными, исключая выходные дни?

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 20 января 2011

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

Вот пример:

declare @start_date datetime
declare @end_date datetime
set @start_date = '2010-12-20'
set @end_date = '2010-12-26'

-- A table with all non-working days.  This just adds Christmass, but you
-- probably should add weekends as well.
declare @non_working_days table (dt datetime)
insert @non_working_days values ('2010-12-25'), ('2010-12-26')

-- Remove the time part
set @start_date = DATEADD(D, 0, DATEDIFF(D, 0, @start_date))
set @end_date = DATEADD(D, 0, DATEDIFF(D, 0, @end_date))

-- Find the number of non-working-days
declare @nwd_count int
select  @nwd_count = count(*) 
from    @non_working_days 
where   dt >= @start_date and dt < @end_date

-- Print result
select datediff(DAY, @start_date, @end_date) - @nwd_count

Это печатает 5, потому что 25-й не рабочий день.

2 голосов
/ 20 января 2011

Праздники не универсальны - они зависят очень от вашего местоположения.Даже тот факт, что дни недели являются «рабочими» днями, не совпадает - это зависит от вашего местоположения.

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

Вам нужно иметь таблицу выходных дней где-нибудь в вашей системе и обрабатывать ее самостоятельно.

Некоторые сообщения, которые могут быть вам полезны:

1 голос
/ 20 января 2011

Иметь таблицу, в которой есть строка для каждой интересующей вас даты, и, скажем, столбец «рабочих часов» или просто индикатор «рабочего дня», если вы хотите сделать это с дневной детализацией.(Я считаю, что этот подход делает финальный SQL проще, плюс включает все виды других полезных запросов, но затем я обращаюсь к хранилищу данных, а не к рабочим базам данных, поэтому вы можете найти подход «просто перечислить праздники» лучше, в зависимости..)

Вам, конечно, придется создавать эту таблицу самостоятельно, исходя из некоторого количества дат выходных для интересующего вас региона.

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

Тогда вы просто

SELECT
   SUM(working_hours)
FROM 
   all_dates 
WHERE
   the_date BETWEEN @start_date AND @end_date

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...