Мне трудно получить точное общее время перерыва между двумя датами.Вот мой запрос
SELECT
FORMAT(CAST(CONCAT(a.start_date,' ',a.start_time) as datetime2), 'MM/dd/yyyy hh:mm:ss tt') as Start_Time,
FORMAT(CAST(CONCAT(a.end_date,' ',a.end_time) as datetime2), 'MM/dd/yyyy hh:mm:ss tt') as End_Time,
DATEDIFF(MINUTE, CONCAT(a.start_date,' ',a.start_time), CONCAT(a.end_date,'',a.end_time)) / 60.0 as TotalTime,
c.break_from,
c.break_to,
ISNULL((DATEDIFF(MINUTE, c.break_from,c.break_to) / 60.0 *DATEDIFF(DAY, a.start_date, a.end_date)+1), 0)as TotalBreak,
ISNULL((DATEDIFF(MINUTE, CAST(CONCAT(a.start_date,' ',a.start_time) as datetime2), CAST(CONCAT(a.end_date,' ',a.end_time) as datetime2))/60.0), 0) as OriginalTime,
ISNULL(((DATEDIFF(MINUTE, break_start, break_end))*(DATEDIFF(DAY, a.start_date, a.end_date)+1)), 0) as Break_,
ISNULL((((DATEDIFF(MINUTE, CAST(CONCAT(a.start_date,' ',a.start_time) as datetime2), CAST(CONCAT(a.end_date,' ',a.end_time) as datetime2))) -
ISNULL((((DATEDIFF(minute, break_start, break_end))*(DATEDIFF(DAY, a.start_date, a.end_date)+1)), 0))/60.0), 0)as EstimatedTotalWorkHours,
ISNULL(c.code, 'TIME14') as TimeReference
FROM
spms_tblSubTask AS a
LEFT JOIN
pmis.dbo.employee as b ON a.eid = b.eid
LEFT JOIN
pmis.dbo.time_reference as c ON c.code = ISNULL(b.TimeReference, 'TIME14')
CROSS APPLY
(SELECT
break_start = CASE WHEN CAST(CONCAT(a.start_date,' ',c.break_from) as datetime2) between CAST(CONCAT(a.start_date,' ',a.start_time) as datetime2)and CAST(CONCAT(a.end_date,' ',a.end_time) as datetime2)
then CAST(CONCAT(a.start_date,' ',c.break_from) as datetime2)
when CAST(CONCAT(a.start_date,' ',a.start_time) as datetime2) between CAST(CONCAT(a.start_date,' ',c.break_from) as datetime2) and CAST(CONCAT(a.start_date,' ',c.break_to) as datetime2)
then CAST(CONCAT(a.start_date,' ',a.start_time) as datetime2)
else NULL
end,
break_end = case when CAST(CONCAT(a.start_date,' ',c.break_to) as datetime2) between CAST(CONCAT(a.start_date,' ',a.start_time) as datetime2) and CAST(CONCAT(a.end_date,' ',a.end_time) as datetime2)
then CAST(CONCAT(a.start_date,' ',c.break_to) as datetime2)
when CAST(CONCAT(a.start_date,' ',a.end_time) as datetime2) between CAST(CONCAT(a.start_date,' ',c.break_from) as datetime2) and CAST(CONCAT(a.start_date,' ',c.break_to) as datetime2)
then CAST(CONCAT(a.start_date,' ',a.end_time) as datetime2)
end) as d
WHERE
b.Shift = 0
Вывод:
![enter image description here](https://i.stack.imgur.com/JJCx6.png)
Здесь мы видим, что в ROW 1
он работает именно так, как я хочу, но обратите внимание, что в ROW 4
он заканчивается на 9:00 am
на следующий день, что означает, что он не падает в часы перерыва на третий день.Как я могу решить это?Спасибо