Я использую приведенную ниже функцию для расчета прошедшего времени между двумя входными временными метками.Следует рассчитывать только время, проведенное в рабочее время.Часы работы: понедельник-суббота с 8:00 до 18:00.
Синтаксис вызова функции: выберите xxxxx ('2018.09.28 19:02:28', '2018-09-29 10:40:35') Функциявыводит 98 минут, правильный ответ - 160 минут.
Структура функции:
Create FUNCTION xxxxx (@LeadAssignTime DATETIME, @LeadContactTime DATETIME)
RETURNS VARCHAR(9)
AS
BEGIN
DECLARE @Temp BIGINT
SET @Temp=0
DECLARE @LeadAssignDay VARCHAR(9)
SET @LeadAssignDay = CONVERT(VARCHAR(9),@LeadAssignTime, 112)
DECLARE @LeadContactDay VARCHAR(9)
SET @LeadContactDay = CONVERT(VARCHAR(9),@LeadContactTime, 112)
DECLARE @StartTime VARCHAR(9)
SET @StartTime = CONVERT(VARCHAR(9),@LeadAssignTime, 108)
DECLARE @FinishTime VARCHAR(9)
SET @FinishTime = CONVERT(VARCHAR(9),@LeadContactTime, 108)
DECLARE @WorkStart VARCHAR(9)
SET @WorkStart = '08:00:00'
DECLARE @WorkFinish VARCHAR(9)
SET @WorkFinish = '18:00:00'
IF (@StartTime<@WorkStart)
BEGIN
SET @StartTime = @WorkStart
END
IF (@FinishTime>@WorkFinish)
BEGIN
SET @FinishTime=@WorkFinish
END
DECLARE @CurrentDate VARCHAR(9)
SET @CurrentDate = CONVERT(VARCHAR(9),@LeadAssignTime, 112)
DECLARE @LastDate VARCHAR(9)
SET @LastDate = CONVERT(VARCHAR(9),@LeadContactTime, 112)
WHILE(@CurrentDate<=@LastDate)
BEGIN
IF (DATEPART(dw, @CurrentDate)!=1 )
BEGIN
IF (@CurrentDate!=@LeadAssignDay) AND (@CurrentDate!=@LeadContactDay)
BEGIN
SET @Temp = (@Temp + (8*60))
END
ELSE IF (@CurrentDate=@LeadAssignDay) AND (@CurrentDate!=@LeadContactDay)
BEGIN
SET @Temp = @Temp + DATEDIFF(MINUTE, @StartTime, @WorkFinish)
END
ELSE IF (@CurrentDate!=@LeadAssignDay) AND (@CurrentDate=@LeadContactDay)
BEGIN
SET @Temp = @Temp + DATEDIFF(MINUTE, @WorkStart, @FinishTime)
END
ELSE IF (@CurrentDate=@LeadAssignDay) AND (@CurrentDate=@LeadContactDay)
BEGIN
SET @Temp = DATEDIFF(MINUTE, @StartTime, @FinishTime)
END
END
SET @CurrentDate = CONVERT(VARCHAR(9),DATEADD(day, 1, @CurrentDate),112)
END
Return @TEMP
END