Ukkaskadgel.ru

Документооборот онлайн
9 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Количество рабочих дней между двумя датами

Рассчитать количество рабочих дней между двумя датами?

В C#, как я могу рассчитать количество рабочих (или будних) дней между двумя датами?

25 ответов

  • Рассчитайте количество рабочих дней между двумя днями

Мне нужно рассчитать количество рабочих дней между двумя датами. Как я могу это сделать, используя Ruby (или Rails. if есть Rails-специфические помощники). Точно так же я хотел бы иметь возможность добавлять рабочие дни к заданной дате. Поэтому, если дата выпадала на четверг, и я добавлял 3.

Мне нужно рассчитать количество рабочих дней (рабочих дней) между двумя заданными датами. Рабочие дни — это все дни недели, кроме субботы и воскресенья. Я не рассматриваю праздники в этом графе. Как рассчитать количество рабочих дней между двумя датами ?

У меня уже была такая задача, и у меня есть решение. Я бы не стал перечислять все промежуточные дни, когда этого можно избежать, как в данном случае. Я даже не упоминаю о создании группы экземпляров DateTime, как я видел в одном из ответов выше. Это действительно пустая трата вычислительной мощности. Особенно в реальной ситуации, когда приходится изучать временные интервалы в несколько месяцев. Смотрите мой код с комментариями ниже.

Правка Slauma, август 2011

Отличный ответ! Однако есть небольшая ошибка. Я беру на себя свободу редактировать этот ответ, так как ответчик отсутствует с 2009 года.

Приведенный выше код предполагает, что DayOfWeek.Sunday имеет значение 7 , что не так. На самом деле это значение равно 0 . Это приводит к неправильному вычислению, если, например, firstDay и lastDay -одно и то же воскресенье. В этом случае метод возвращает 1 , но он должен быть 0 .

Самое простое исправление этой ошибки: Замените в коде выше строки, где firstDayOfWeek и lastDayOfWeek объявлены следующими:

Теперь результат таков:

  • С пятницы по пятницу -> 1
  • С субботы по субботу -> 0
  • С воскресенья по воскресенье -> 0
  • С пятницы по субботу -> 1
  • С пятницы по воскресенье -> 1
  • С пятницы по понедельник -> 2
  • С субботы по понедельник -> 1
  • С воскресенья по понедельник -> 1
  • С понедельника по понедельник -> 1
  • Количество рабочих дней между двумя датами

Мне нужно количество рабочих дней между датами. Например , если у нас есть 01-01-2012 и 20-01-2012 , я хочу получить количество рабочих дней между этими двумя датами, используя T-SQL.

select count(distinct(dateadd(d, 0, datediff(d, 0,checktime)))) as workingdays from departments, dbo.USERINFO INNER JOIN dbo.CHECKINOUT ON dbo.USERINFO.USERID = dbo.CHECKINOUT.USERID where userinfo.name=’Gokul Gopalakrishnan’ and deptname=’GEN/SUP-TBL’ and checktime>=’2014-05-01′ and.

Хорошо. Я думаю, что пришло время опубликовать правильный ответ:

Я знаю, что этот вопрос уже решен, но я подумал, что мог бы дать более простой ответ, который может помочь другим посетителям в будущем.

Вот мой взгляд на это:

Это было мое первоначальное представление:

Определите метод расширения на DateTime следующим образом:

Затем используйте в предложении Where для фильтрации более широкого списка дат:

Я использовал следующий код, чтобы также учитывать банковские праздники:

И Модульные Тесты:

Ну, этого забили до смерти. 🙂 Однако я все равно собираюсь дать другой ответ, потому что мне нужно было что-то немного другое. Это решение отличается тем, что оно возвращает Business TimeSpan между началом и концом, и вы можете установить рабочие часы дня и добавить праздники. Таким образом, вы можете использовать его для расчета того, произойдет ли это в течение дня, в течение нескольких дней, в выходные и даже в праздничные дни. И вы можете получить только рабочие дни или нет, просто получив то, что вам нужно, из возвращенного объекта TimeSpan. И то, как он использует списки дней, вы можете видеть, как легко было бы добавить список нерабочих дней, если это не типичные Сб и Вс. И я тестировал в течение года, и это кажется очень быстрым.

Я просто надеюсь, что вставка кода будет точной. Но я знаю, что это работает.

И вот тестовый код: Обратите внимание, что вам просто нужно поместить эту функцию в класс с именем DateHelper , чтобы тестовый код работал.

Это решение позволяет избежать итераций, работает как для +ve, так и для-ve различий в днях недели и включает набор модульных тестов для регрессии против более медленного метода подсчета дней недели. Я также включил краткий метод добавления дней недели, который также работает таким же неитеративным способом.

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

Важно : Мы исходим из предположения, что считаем дни, исключая дату начала и включая дату окончания. Это важно при подсчете дней недели, поскольку конкретные начальные/конечные дни, которые вы включаете/исключаете, влияют на результат. Это также гарантирует, что разница между двумя равными днями всегда равна нулю и что мы включаем только полные рабочие дни, поскольку обычно вы хотите, чтобы ответ был правильным для любого времени на текущую дату начала (часто сегодня) и включал полную дату окончания (например, дату оплаты).

NOTE: Этот код нуждается в дополнительной корректировке для праздников, но в соответствии с вышеизложенным предположением этот код должен исключать праздники в дату начала.

Добавить дни недели:

Вычислить разницу в днях недели:

Я обнаружил, что большинство других решений на stack overflow были либо медленными (итеративными), либо чрезмерно сложными, и многие из них были просто неправильными. Мораль этой истории в том, что . Не доверяйте ей, если вы не проверили ее полностью!!

Модульные тесты, основанные на комбинаторном тестировании NUnit и расширении ShouldBe NUnit.

Я много искал, легко усваиваемый алгоритм для расчета рабочих дней между 2 датами, а также для исключения национальных праздников, и, наконец, я решил пойти с этим подходом:

В основном я хотел идти на каждое свидание и оценивать свои условия:

  1. Это не суббота
  2. Это не воскресенье
  3. Это не национальный праздник

но также я хотел избежать повторения дат.

Запустив и измерив время, необходимое для оценки 1 полного года, я получаю следующий результат:

Изменить: новый метод более простой:

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

Вот краткий пример кода. Это метод класса, поэтому он будет работать только внутри вашего класса. Если вы хотите , чтобы это было static , измените подпись на private static (или public static ).

Этот метод создает переменную цикла d , инициализирует ее в день начала sd , а затем увеличивает на один день каждую итерацию ( d = d.AddDays(1) ).

Он возвращает нужные значения с помощью yield , что создает iterator . Самое классное в итераторах то, что они не хранят в памяти все значения IEnumerable , а только последовательно вызывают каждое из них. Это означает, что вы можете вызывать этот метод с незапамятных времен и по сей день, не беспокоясь о нехватке памяти.

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

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

Читать еще:  Безотзывная доверенность как правильно использовать?

Вот функция, которую мы можем использовать для расчета рабочих дней между двумя датами. Я не использую список отпусков, так как он может варьироваться в зависимости от country/region.

Если мы все равно хотим его использовать, мы можем взять третий аргумент в качестве списка праздников, и перед увеличением количества мы должны проверить, что список не содержит d

Работает и без петель

Этот метод не использует никаких циклов и на самом деле довольно прост. Он расширяет диапазон дат до полных недель, так как мы знаем, что каждая неделя состоит из 5 рабочих дней. Затем он использует таблицу поиска, чтобы найти количество рабочих дней, которые нужно вычесть из начала и конца, чтобы получить правильный результат. Я расширил расчеты, чтобы показать, что происходит, но при необходимости все это можно было бы сжать в одну строку.

В любом случае, это работает для меня, и поэтому я решил опубликовать его здесь, на случай, если это может помочь другим. Счастливого кодирования.

Расчет

  • t : Общее количество дней между датами (1, если min = max)
  • a + b : Дополнительные дни, необходимые для расширения общего числа до полных недель
  • k : 1.4-количество дней недели в неделю, т. е. (t / 7) * 5
  • c : Количество дней недели для вычитания из общей суммы
  • m : Таблица поиска, используемая для поиска значения «c» для каждого дня недели

Культура

Код предполагает рабочую неделю с понедельника по пятницу. Для других культур, например с воскресенья по четверг, вам нужно будет компенсировать даты до расчета.

Метод

Я просто поделюсь своим решением. Это сработало для меня, может быть, я просто не замечаю/не знаю, что есть ошибка. Я начал с того, что получил первую неполную неделю, если она вообще есть. полная неделя была с воскресенья на субботу, поэтому, если (int)_now.DayOfWeek не было 0(воскресенье), первая неделя была неполной.

Я просто вычитаю 1 из числа первых недель для субботы первой недели, а затем добавлю его в новое число;

Затем я получаю последнюю неполную неделю, затем вычитаю 1, потому что это воскресенье, а затем добавляю к новому счету.

Затем, наконец, количество полных недель, умноженное на 5(будни), было добавлено к новому подсчету.

Вот одно очень простое решение этой проблемы. У нас есть дата начала, дата окончания и «for loop» для увеличения дня и вычисления, чтобы узнать, рабочий ли это день или выходные, путем преобразования в строку DayOfWeek.

На основе комментария , отмеченного как ответ и рекомендуемый патч, а также -> Эта версия хочет преобразовать дни в рабочие часы . Также учитывает часы того же дня.

У меня возникли проблемы с поиском надежной версии этого кода TSQL. Ниже, по сути, приведено преобразование кода C# здесь с добавлением таблицы праздников, которая должна использоваться для предварительного расчета праздников.

Я только что улучшил ответы @Alexander и @Slauma, чтобы поддерживать рабочую неделю в качестве параметра для случаев, когда суббота является рабочим днем, или даже для случаев, когда есть всего несколько дней недели, которые считаются рабочими днями:

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

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

Я считаю, что это может быть более простым способом:

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

Таким образом, foreach должно быть:

Вот вспомогательная функция, которую я написал для этой задачи.
он также возвращает количество выходных дней с помощью параметра out .
если вы хотите, вы можете настроить «weekend» день во время выполнения для стран, в которых используются разные выходные дни, или включить праздники с помощью необязательного параметра weekendDays[] :

Вот подход, если вы используете MVC. Я также рассчитал национальные праздники или любые праздничные дни, которые должны быть исключены, извлекая их из holidayscalendar, который вам нужно будет сделать.

Leavemodel-это список здесь

Похожие вопросы:

Как я могу рассчитать количество дней между двумя датами? В приведенном ниже коде я должен получить количество часов, а это значит, что мне нужно будет только разделить их на 24. Однако результат.

Мне нужно рассчитать количество дней между 2 датами. Я проверил коды, приведенные по этой ссылке Как рассчитать количество дней между двумя датами с помощью JavaScript? . В этом примере, если дать.

У меня есть две даты в формате dd/mm/yyyy. Как рассчитать количество дней между этими двумя датами в javascript/jquery. Пример: дата ФОМ 20/06/2000, на сегодняшний день составляет 16/08/2011

Мне нужно рассчитать количество рабочих дней между двумя датами. Как я могу это сделать, используя Ruby (или Rails. if есть Rails-специфические помощники). Точно так же я хотел бы иметь возможность.

Мне нужно рассчитать количество рабочих дней (рабочих дней) между двумя заданными датами. Рабочие дни — это все дни недели, кроме субботы и воскресенья. Я не рассматриваю праздники в этом графе. Как.

Мне нужно количество рабочих дней между датами. Например , если у нас есть 01-01-2012 и 20-01-2012 , я хочу получить количество рабочих дней между этими двумя датами, используя T-SQL.

select count(distinct(dateadd(d, 0, datediff(d, 0,checktime)))) as workingdays from departments, dbo.USERINFO INNER JOIN dbo.CHECKINOUT ON dbo.USERINFO.USERID = dbo.CHECKINOUT.USERID where.

DateDiff() дает мне количество календарных дат между двумя датами. Как я могу получить количество рабочих дней (исключая Sat/Sun)?

Как узнать количество рабочих дней(с понедельника по пятницу) между двумя датами в SAP HANA ? Нам не нужно думать о праздниках. Мы не можем использовать WORKDAYS_BETWEEN(), так как у нас нет таблицы.

Мне нужно рассчитать количество дней в месяц между двумя датами. Существует ли формула Excel 2016 для этого ? Спасибо

Рассчитать количество рабочих дней между двумя датами?

В С#, как я могу рассчитать количество деловых (или рабочих дней) дней между двумя датами?

28 ответов

У меня была такая задача раньше, и у меня есть решение. Я бы избегал перечислять все дни между ними, когда это можно было бы избежать, что и есть здесь. Я даже не упоминаю о создании кучи экземпляров DateTime, как я видел в одном из ответов выше. Это действительно трата вычислительной мощности. Особенно в ситуации с реальным миром, когда вам нужно изучить промежутки времени в несколько месяцев. См. Мой код с комментариями ниже.

Редактировать по Slauma, август 2011

Отличный ответ! Однако есть небольшая ошибка. Я беру на себя свободу редактирования этого ответа, поскольку ответчик отсутствует с 2009 года.

В приведенном выше коде предполагается, что DayOfWeek.Sunday имеет значение 7 , что не так. Фактически это значение 0 . Это приводит к неправильному вычислению, если, например, firstDay и lastDay являются одинаковыми в воскресенье. Метод возвращает 1 в этом случае, но он должен быть 0 .

Самое простое исправление для этой ошибки: Замените в коде выше строки, где firstDayOfWeek и lastDayOfWeek объявлены следующим образом:

  • Пятница по пятницу → 1
  • С субботы по субботу → 0
  • С воскресенья по воскресенье → 0
  • Пятница — Суббота → 1
  • С пятницы по воскресенье → 1
  • Пятница по понедельник → 2
  • С субботы по понедельник → 1
  • С воскресенья по понедельник → 1
  • С понедельника по понедельник → 1
Читать еще:  Декларация ЕНВД на 2021

Ok. Я думаю, что настало время опубликовать правильный ответ:

P.S. Решения, опубликованные выше, заставляют меня по какой-то причине.

Я знаю, что этот вопрос уже решен, но я подумал, что могу предложить более простой ответ, который может помочь другим посетителям в будущем.

Это было мое оригинальное сообщение:

Определите метод расширения в DateTime следующим образом:

Затем используется внутри предложения Where для фильтрации более широкого списка дат:

Я использовал следующий код, чтобы принять участие в банковских праздниках:

И тесты устройств:

Ну, это было избито до смерти.:) Тем не менее, я все еще собираюсь дать другой ответ, потому что мне нужно что-то совсем другое. Это решение отличается тем, что оно возвращает бизнес TimeSpan между началом и концом, и вы можете установить рабочие часы дня и добавить праздники. Таким образом, вы можете использовать его для расчета, если это происходит в течение дня, через дни, выходные и праздничные дни. И вы можете получить только рабочие дни или нет, просто получая то, что вам нужно от возвращаемого объекта TimeSpan. И как он использует списки дней, вы можете видеть, как очень легко было бы добавить список нерабочих дней, если это не типичный Сб и Солнце. И я тестировал год, и это кажется очень быстрым.

Я просто надеюсь, что вставка кода верна. Но я знаю, что это работает.

И вот тестовый код: обратите внимание, что вам просто нужно поместить эту функцию в класс с именем DateHelper, чтобы тестовый код работал.

Это решение избегает итерации, работает как для разницы между + ve и -ve в будние дни, так и включает набор unit test для регрессии против более медленного метода подсчета будних дней. Я также включаю краткий метод добавления будних дней также работает с тем же неитеративным способом.

Модульные тесты охватывают несколько тысяч комбинаций даты, чтобы полностью проверить все комбинации дней и дней недели недели с небольшими и большими диапазонами дат.

Важно. Мы делаем предположение, что мы рассчитываем дни, исключая дату начала и включая дату окончания. Это важно при подсчете будних дней, поскольку конкретные начальные/конечные дни, которые вы включаете/исключаете, влияют на результат. Это также гарантирует, что разница между двумя равными днями всегда равна нулю и что мы включаем только полные рабочие дни, так как обычно вы хотите, чтобы ответ был правильным в любое время в текущей дате начала (часто сегодня) и включал полную дату окончания (например, установленный срок).

ПРИМЕЧАНИЕ. Этот код нуждается в дополнительной настройке для праздников, но в соответствии с вышеприведенным допущением этот код должен исключать праздники в дату начала.

Добавить будние дни:

Вычислить разницу в будние дни:

Я обнаружил, что большинство других решений при переполнении стека были либо медленными (итеративными), либо слишком сложными, и многие из них были просто неверными. Мораль истории. Не верьте ей, если вы ее исчерпывающе не протестировали!!

Модульные тесты, основанные на NUnit Combinatorial testing и ShouldBe Расширение NUnit.

Число рабочих дней между двумя датами

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

Прибавить дни к дате

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

Вычисление количества дней между датами

Этот метод расчета ответит на вопрос «сколько дней прошло с даты». Введите начальную дату и конечную дату и нажмите кнопку «рассчитать». Калькулятор покажет, сколько дней между введенными датами. Отдельно калькулятор покажет количество рабочих дней.

С помощью этой опции можно вычислить сколько дней осталось до определенного события, например до дня рождения или праздника. Для этого в поле начальной даты укажите сегодняшнее число, а в поле конечной даты – дату события.

Праздничные дни

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

  • 1,2,3,4,5,6,8 января – новогодние каникулы
  • 7 января – православное Рождество
  • 23 февраля – День защитника Отечества
  • 8 марта – Международный женский день
  • 1 мая – Праздник Весны и Труда
  • 9 мая – День Победы
  • 12 июня – День России
  • 4 ноября – День народного единства

Если праздничный день выпал на субботу или воскресенье, его переносят на ближайший рабочий день. Но иногда выходные переносят совсем в другое место календаря. Например, субботу и воскресенье, выпавшие на новогодние праздники, могут перенести на май, чтобы продлить майские праздники.

Калькулятор при расчете дней учитывает как официальные праздничные даты, так и все переносы.

Калькулятор дней между двумя датами может пригодиться бухгалтеру или кадровику. Также данный инструмент расчета поможет юристу, когда для подачи судебного иска нужно узнать количество дней просрочки платежа.

Вы сможете посчитать:

  • сколько календарных дней прошло между двумя заданными датами;
  • сколько рабочих дней и часов в заданном вами периоде;
  • сколько выходных дней было в заданном вами периоде.

Как работать с калькулятором дней между двумя датами

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

Также следует задать количество рабочих часов в день. Например, у офисных работников стандартный рабочий день составляет 8 часов, а на производстве рабочая смена может длиться 10 часов. По умолчанию в калькуляторе указано 8 рабочих часов в сутки.

После того как вы введете в поля калькулятора нужные значения, справа отразится полный расчет. В нем вы увидите количество календарных и рабочих дней, а также количество рабочих часов согласно заданным параметрам.

Пример. Директор ООО «Мечта» дал поручение главному бухгалтеру: рассчитать количество отработанных часов в IV квартале 2018 года. Все работники фирмы в этот период работали по графику, в отпуска не ходили. Главбух открыл онлайн-калькулятор и ввел следующие данные:

Начальная дата — 01.10.2018

Конечная дата — 31.12.2018

Поле «Количество рабочих часов» главбух оставил без изменений.

Калькулятор автоматически произвел расчет и выдал такие цифры:

  • календарных дней — 92;
  • рабочих дней — 65;
  • рабочих часов — 520.

Калькулятор учитывает и сокращенные дни. Например, 02.11.2018 был сокращенный на один час день, и вместо 521 дней калькулятор выдал 520 дней (64 х 8 — 1).

Календарных днейРабочих днейРабочих часов

Бесплатный онлайн калькулятор Контур.Бухгалтерии вам поможет и подскажет, какое количество дней прошло между двумя заданными датами. Кроме того, если у вас возникла необходимость, вы можете посчитать сколько календарных, выходных или рабочих дней (часов) содержит указанный период года или нескольких лет.

Сколько дней между датами? Инструкция

Хотите легко считать пени, зарплату, пособия, среднесписочную численность? Пользуйтесь облачным сервисом Контур.Бухгалтерия! Сервис быстро проведет расчет и автоматически сформирует отчет.

Вы просто задаете конкретный день начала и конца и через доли секунд получаете расчет. Все данные онлайн-калькулятор считает самостоятельно. Если вы изменяете исходные дни недели, результат автоматически пересчитывается, с учетом високосного года.

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

Итак, порядок действий:

  1. В полях “Начальная дата” и “Конечная дата” выбираете соответственно начальный и конечный день отсчета, начиная с 2013 года и заканчивая в будущем 2018-м.
  2. Устанавливаете в следующем поле количество рабочих часов в сутках. По умолчанию в этом поле уже стоит 8 часов (40-часовая рабочая неделя), но вы можете эту цифру изменить.
  3. В правой части экрана на баннере вы увидите полученный результат: рабочие дни, календарные дни и рабочие часы между заданными датам. Результаты нужно скопировать и сохранить в своем документе.
Читать еще:  Муниципальная собственность на землю и ее виды

Для чего можно использовать калькулятор

Хотите легко считать пени, зарплату, пособия, среднесписочную численность? Пользуйтесь облачным сервисом Контур.Бухгалтерия! Сервис быстро проведет расчет и автоматически сформирует отчет.

  1. Для расчета пени и просрочек по договорам
  2. Как понять эффективность использования какого-нибудь ресурса и предельные сроки использования
  3. Как случайно не назначить сроки выполнения задачи на выходной день
  4. Сколько времени осталось до дедлайна
Пример:

Вы — бухгалтер. Руководитель попросил вас в ближайшие пару минут предоставить данные по количеству рабочих часов, которые должны отработать все сотрудники компании в феврале. Количество работников вы можете легко определить — у вас перед глазами цифры. А вот количество часов нужно считать. А сколько там в феврале дней? А год-то високосный? А какие дни были выходными? А как определить количество дней праздников?

Решение: просто воспользуйтесь нашим виджетом. Всю информацию вы получите автоматически, вам не нужны настольные календари и калькуляторы.

Функция ЧИСТРАБДНИ.МЕЖД

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

Синтаксис

Аргументы функции ЧИСТРАБДНИ.МЕЖД описаны ниже.

Нач_дата и кон_дата Обязательный. Даты, разницу между которыми требуется вычислить. Начальная дата может предшествовать конечной дате, совпадать с ней или быть позже нее.

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

Номера обозначают следующие выходные дни:

Номер выходного дня

Строковые значения дней недели включают семь знаков, каждый из которых обозначает день недели (начиная с понедельника). Значение 1 представляет нерабочие дни, а 0 — рабочие дни. В строке допустимо использовать только знаки 1 и 0. При значении 1111111 всегда возвращается 0.

Например, 0000011 означает, что выходными днями являются суббота и воскресенье.

Праздники Необязательный. Набор из одной или нескольких дат, которые необходимо исключить из календаря рабочих дней. Значение «праздники» должно быть диапазоном ячеек, содержащих даты, или константой массива, включающей порядковые значения, которые представляют даты. Порядок дат или значений может быть любым.

Замечания

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

Если start_date вне диапазона для текущего базового значения даты, NETWORKDAYS. InTL возвращает #NUM! значение ошибки #ЗНАЧ!.

Если end_date вне диапазона для текущего базового значения даты, NETWORKDAYS. InTL возвращает #NUM! значение ошибки #ЗНАЧ!.

Если строка выходных дней имеет недействительные длину или содержит недопустимые символы, NETWORKDAYS. InTL возвращает #VALUE! значение ошибки #ЗНАЧ!.

Пример

Скопируйте образец данных из следующей таблицы и вставьте их в ячейку A1 нового листа Excel. Чтобы отобразить результаты формул, выделите их и нажмите клавишу F2, а затем — клавишу ВВОД. При необходимости измените ширину столбцов, чтобы видеть все данные.

Получаем 22 предстоящих рабочих дня. Вычитает 9 нерабочитающих выходных дней (5 суббот и 4 воскресенья) из общего числа дней между двумя датами. По умолчанию суббота и воскресенье считаются нерабочитами.

Получаем -21, т. е. 21 прошедший рабочий день.

Из 32 дней между 1 января 2006 и 1 февраля 2006 года вычитаем 10 нерабочих дней (4 пятницы, 4 субботы и 2 праздника) и получаем 22 предстоящих рабочих дня. Используем аргумент 7 в качестве выходных дней, которыми являются субботы и воскресенья. Также на этой период времени приходится два праздника.

Получаем 22 предстоящих рабочих дня. Такой же период времени, как и в приведенном выше примере, но с выходными днями по субботам и средам.

Количество рабочих дней между двумя датами

Как рассчитать количество рабочих дней между двумя датами в SQL Server?

С понедельника по пятницу, и он должен быть T-SQL.

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

Если вы хотите включить праздничные дни, вам нужно немного поработать.

В Расчет рабочих дней вы можете найти хорошую статью об этой теме, но, как видите, она не продвинулась вперед.

Если вам нужно использовать собственный календарь, вам может потребоваться добавить некоторые проверки и некоторые параметры. Надеюсь, это послужит хорошей отправной точкой.

Все кредиты Богдану Максиму и Питеру Мортенсену. Это их сообщение, я просто добавил праздники к функции (Предполагается, что у вас есть таблица «tblHolidays» с полем «дата-время» ).

Моя версия принятого ответа как функции с помощью DATEPART , поэтому мне не нужно выполнять сравнение строк в строке с

Во всяком случае, здесь мой бизнес датирует функцию

(Я немного отстаю от комментариев)

Если вы решите отказаться от +1 дня в элегантном решении CMS, обратите внимание, что если ваша дата начала и дата окончания находятся в одни и те же выходные, вы получаете отрицательный ответ. Т.е., 2008/10/26 по 2008/10/26 возвращается -1.

мое довольно упрощенное решение:

. который также устанавливает все ошибочные сообщения с датой начала после окончания даты до нуля. Что-то, что вы можете или не ищете.

Другим подходом к расчету рабочих дней является использование цикла WHILE, который в основном выполняет итерацию через диапазон дат и увеличивает его на 1, если дни будут найдены в течение понедельника по пятницу. Полный script для расчета рабочих дней с использованием цикла WHILE показан ниже:

Хотя опция цикла WHILE является более чистой и использует меньше строк кода, она может быть узким местом производительности в вашей среде, особенно когда ваш диапазон дат охватывает несколько лет.

Для разницы между датами, включая праздники, я пошел следующим образом:

1) Таблица с праздниками:

2) У меня была таблица с планами как это, и я хотел заполнить столбец Work_Days, который был пуст:

3) Итак, чтобы получить «Work_Days», чтобы позже заполнить мой столбец, нужно было:

Надеюсь, что я мог бы помочь.

Вот версия, которая работает хорошо (я думаю). Таблица праздников содержит столбцы Holiday_date, которые содержат праздники, которые ваша компания наблюдает.

Использование таблицы дат:

Если у вас этого нет, вы можете использовать таблицу чисел:

Они должны быть быстрыми, и это устраняет двусмысленность/сложность. Первый вариант является лучшим, но если у вас нет таблицы календаря, вы всегда можете создать таблицу чисел с CTE.

Это в основном ответ CMS, не зависящий от определенного языкового параметра. И поскольку мы снимаем для общего, это означает, что он должен работать и для всех параметров @@datefirst .

datediff(week, . ) всегда использует границу с субботы по воскресенье в течение нескольких недель, поэтому выражение детерминировано и не нуждается в изменении (пока наше определение будних дней будет постоянно с понедельника по пятницу). Нумерация дня в соответствии с настройкой @@datefirst , и модифицированные вычисления обрабатывают эту коррекцию с небольшим усложнением некоторой модульной арифметики.

Более чистый способ борьбы с субботой/воскресенью — перевести даты до извлечения значения дня недели. После смещения значения вернутся в соответствие с фиксированной (и, вероятно, более известной) нумерацией, которая начинается с 1 в воскресенье и заканчивается 7 в субботу.

0 0 голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты