Вот пример выбора, касающийся ограничений, которые вы описали.CTE создают таблицы для целей тестирования.Основной запрос показывает расчеты.Вы работали с датами и датами, поэтому тайны нет.Если вы раньше не использовали%, то для округления времени до 15 минут используется оператор по модулю .
;with worker (ID, overtime, startTime, endTime) as
(
select 1, 1, CAST ('08:30' as time), CAST ('16:30' as time)
union all
select 2, 0, CAST ('08:30' as time), CAST ('16:30' as time)
union all
select 3, 0, CAST ('08:30' as time), CAST ('16:30' as time)
),
-- Test table of workflows
wf (workerID, login, logout) as
(
select 1, CAST ('2012-03-11 08:20' as datetime), CAST ('2012-03-11 19:33' as datetime)
union all
select 2, CAST ('2012-03-11 08:50' as datetime), CAST ('2012-03-11 16:20' as datetime)
union all
select 3, CAST ('2012-03-11 08:22' as datetime), CAST ('2012-03-11 16:18' as datetime)
)
select wf.workerID,
wf.login,
wf.logout,
-- if starttime > login return startTime else login
case when DATEDIFF(MI, w.startTime, cast (wf.login as time)) < 0
then cast(CAST (wf.login AS date) AS datetime) + w.startTime
else wf.login
end roundedLogin,
case when w.overtime = 1 -- Round to 15 minutes whenever finished
OR
-- Round to 15 minutes if left ten or more minutes before endTime
DATEDIFF(MI, cast (wf.logout as time), dateadd (MI, -10, w.endTime)) > 0
then dateadd (MI, -(DATEPART (MI, wf.logout) % 15), wf.logout)
-- stop at endTime if overtime = 0 OR left job at apropriate time
else cast(CAST (wf.logout AS date) AS datetime) + w.endTime
end roundedLogout
from worker w
inner join wf
on w.ID = wf.workerID
При таком подходе возникнет проблема.Когда вы начнете интегрировать математику в исходный запрос, вы заметите, что вам нужно снова написать выражения для оценки округлого логина и округлого лога, чтобы вычислить оплачиваемые часы.Вы не можете повторно использовать псевдоним, определенный в той же области, но вы можете создать производную таблицу или представление или даже вычисляемые поля.Представление, возвращающее столбцы из рабочих процессов и все дополнительные выражения, вероятно, будет наилучшим.
Использование этого представления в других запросах упростит задачу, заключив логику в одном месте.