Мне было дано задание рассчитать количество рабочих часов, затраченных на доставку заказов, с момента, когда заказ был введен впервые, до момента его отправки. Для этого я не могу создать какую-либо функцию из-за проблем с разрешениями.
Рабочие часы: понедельник - пятница, 08:00 - 17:30. Суббота и воскресенье - с 08:00 до 16:00. Необходимо подвести итоги времени, затраченного на эти основные часы.
Если заказ был размещен до начала дня (8 утра), то он должен обрабатывать заказ как ввод в 8 утра. Если заказ был после конца дня (5:30 вечера MF, 4:00 S / SS), тогда обработайте, как если бы заказ был введен в конце дня. То же самое верно и для доставок.
Я искал это и нашел предыдущие ответы на SO, но обнаружил, что все ранее принятые ответы используют функции для этого.
В моем развитии этого, Я достиг этого без использования функций. Я поделюсь своим ответом ниже для будущих поисков / ссылок.
Приветствую любые отзывы о том, как это можно улучшить.
Ниже приведен пример заказа и даты доставки для работы.
IF OBJECT_ID('tempdb..#Orders') IS NOT NULL DROP TABLE #Orders; -- Example data to prove the theory.
CREATE TABLE #Orders (OrderDate DateTime, DeliveryDate DATETIME)
INSERT INTO #Orders (#Orders.OrderDate, #Orders.DeliveryDate)
VALUES
(cast('2020-01-18 13:55:15.000' as datetime), cast('2020-01-19 13:35:56.110' as datetime)),
(cast('2020-01-18 23:47:57.000' as datetime), cast('2020-01-19 13:36:40.537' as datetime)),
(cast('2020-01-18 07:20:12.000' as datetime), cast('2020-01-19 13:37:41.977' as datetime)),
(cast('2020-01-18 08:51:46.813' as datetime), cast('2020-01-19 13:38:35.193' as datetime)),
(cast('2020-01-18 12:37:13.000' as datetime), cast('2020-01-19 14:24:35.927' as datetime)),
(cast('2020-01-18 12:59:54.000' as datetime), cast('2020-01-19 14:53:23.663' as datetime)),
(cast('2020-01-19 13:44:31.000' as datetime), cast('2020-01-19 14:56:47.157' as datetime)),
(cast('2020-01-19 13:38:19.000' as datetime), cast('2020-01-19 14:58:09.543' as datetime)),
(cast('2020-01-19 08:55:31.050' as datetime), cast('2020-01-20 08:17:25.073' as datetime)),
(cast('2020-01-18 21:16:23.000' as datetime), cast('2020-01-20 08:17:52.330' as datetime)),
(cast('2020-01-19 08:59:26.650' as datetime), cast('2020-01-20 08:18:05.163' as datetime)),
(cast('2020-01-19 08:49:24.193' as datetime), cast('2020-01-20 08:18:49.077' as datetime)),
(cast('2020-01-18 15:33:48.000' as datetime), cast('2020-01-20 08:26:24.387' as datetime)),
(cast('2020-01-18 18:45:52.000' as datetime), cast('2020-01-20 08:26:29.657' as datetime)),
(cast('2020-01-18 20:56:33.000' as datetime), cast('2020-01-20 08:27:25.517' as datetime)),
(cast('2020-01-18 08:55:53.100' as datetime), cast('2020-01-20 08:28:25.210' as datetime)),
(cast('2020-01-06 00:19:08.000' as datetime), cast('2020-01-20 08:28:27.197' as datetime)),
(cast('2020-01-18 17:38:50.000' as datetime), cast('2020-01-20 08:42:16.777' as datetime)),
(cast('2020-01-19 14:24:30.000' as datetime), cast('2020-01-20 08:42:37.537' as datetime)),
(cast('2020-01-19 12:00:01.000' as datetime), cast('2020-01-20 08:42:53.173' as datetime)),
(cast('2020-01-19 13:21:15.000' as datetime), cast('2020-01-20 08:43:18.517' as datetime)),
(cast('2020-01-19 04:11:15.000' as datetime), cast('2020-01-20 09:28:34.997' as datetime)),
(cast('2020-01-19 09:28:05.000' as datetime), cast('2020-01-20 09:28:51.447' as datetime)),
(cast('2020-01-16 22:09:49.000' as datetime), cast('2020-01-20 09:29:23.630' as datetime)),
(cast('2020-01-19 13:43:05.000' as datetime), cast('2020-01-20 09:29:41.997' as datetime))