T-SQL функція розрахунку кількості робочих годин між двома датами з урахуванням бізнес-календаря

Отже, готова функція розрахунку кількості робочих годин між двома датами. Дану функцію ми самі використовуємо в звітах щодо підтримки.

Перш розповім як зберігаються дані в бізнес-календарі.
Бізнес календар має 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>

*

*