Вы можете используйте рекурсивное общее табличное выражение для генерации последовательности часов между датами начала и окончания, а затем аргумент case для eval хать которые варьируются она попадает, а затем просуммировать агрегировать:
DECLARE @T TABLE (StartTime DATETIME, EndTime DATETIME)
INSERT @T VALUES ('8/12/14 17:00', '8/14/14 12:00')
;WITH cte AS
(
SELECT StartTime AS dt, EndTime
FROM @T
UNION ALL
SELECT DATEADD(MINUTE, 60, dt) AS dt, EndTime
FROM cte
WHERE dt < DATEADD(HOUR, -1, EndTime)
)
SELECT
SUM(
CASE
WHEN CAST(dt AS TIME) >= '11:00' AND CAST(dt AS TIME) < '23:00' THEN 1
ELSE 0
END) AS '11:00 to 23:00',
SUM(
CASE
WHEN CAST(dt AS TIME) >= '11:00' AND CAST(dt AS TIME) < '23:00' THEN 0
ELSE 1
END) AS '23:00 to 11:00'
FROM cte
Я уверен, что он может быть улучшен, но это должно дать вам желаемый результат. Выход
Sample SQL Fiddle
Пример:
11:00 to 23:00 23:00 to 11:00
-------------- --------------
19 24
Это SQL Fiddle показывает время обработки в 30-минутными интервалами, выход:
11:00 to 23:00 23:00 to 11:00
-------------- --------------
23.5 25.5
И где же '19' и' 24'come из? Пожалуйста, объясните, что вы пытаетесь сделать. –
@juergend Можете ли вы посмотреть мой обновленный вопрос? – Luv
Являются ли эти моменты времени в этой смене? Я не понимаю. Как выглядят ваши исходные данные? –