T-SQL Скрипт для розрахунку кількості робочих годин між двома датами з урахуванням бізнес-календаря в DocsVision, Книги та статті, Різне, статті

Нова версія функції розрахунку робочих годин між двома датами з урахуванням бізнес-календаря. Попередні версії містили помилку.

Отже нагадаю.

Бізнес календар має 3 секції (краще подивитися в CardManager)

1. Основна інформація (тільки одне поле Name, зрозуміло для чого воно потрібно)
2. Року (Years). Має отдного поле Year в якому вказується рік
2.1 Підсекція Days. Має поля Day – номер дня з початку року і Type тип
2.1.1 Підсекція WorkTime. Поля StartTime і EndTime – часовий діапазон
3. DefaultTimeSettings. Поля StartTime і EndTime – часовий діапазон

У календарі можна робити кілька налаштувань.

1. Настрокі робочого часу за умовчанням.
Дана настройка буде зберігатися в секції DefaultTimeSettings. Рядки секції будуть містити тимчасові інтервали.

2. Налаштування конкретного дня.
У цьому випадку буде створена рядок в секції Years, в підсекції Days, в підсекції WorkTime із зазначенням інтервалу.
Наприклад, 02.01.2009 повинен бути робочим днем, з робочого часу з 12:00 до 15:00.
При збереженні дані будуть зберігається таким чином (назви секцій у квадратних дужках):
[Years]: Year = 2009
[Days]: Day = 2
[WorkTime]: StartTime=12:00, EndTime=15:00

3. Налаштування календаря
Дані настройки зберігатимуться в тій же секції Years (аналогічно п.2), але в році 1796.

Якщо для конкретного дня немає збережених налаштувань, береться наступне робочий час:
Робочі дні: з понеділка по п’ятницю
Робочий графік: з 9:00 до 13:00, і з 14:00 до 18:00

Скрипт складається з 3х функцій
1. Перевірка, чи є даний день робочим FIsWorkTime
2. Ф-ція розрахунку тривалості робочого часу для одного дня FGetDayDuration
3. Основна ф-ція розрахунку тривалості між двома датами FBusinessHours2

Алгоритм наступний.
Ф-ція FBusinessHours2 обчислює за допомогою FGetDayDuration тривалість робочого часу в першому дні інтервалу (до кінця першого робочого дня). Тривалість робочого часу в останній день інтервалу (від початку робочого дня до кінцевого часу), і тривалість у всіх днях між початковим і кінцевим.

Оскільки дані зберігаються для конкретних днів, а не для всіх, то єдиним способом підрахунку є перебір всіх днів в циклі. Це вкрай не оптимальний спосіб. Альтернативним варіантом було б періодичне створення “карти” робочого розкладу для абсолютно всіх днів в інтервалі, із зберіганням часу в UTC в окремій таблиці. Тоді розрахунок тривалості можна буде виконати декількома SELECT “ами за частки секунди.

Ф-ція FBusinessHours2 може повертати дані у хвилинах або годинах в залежності від 3-го параметра @ Mode.

У чому ж була помилка?
При рассчете діапазону невраховуваних високосний рік, через це всі дати після лютого були зміщені.
В скрипт додана нова функція, яка враховує даний зрушення.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*