Technical Article

Business Time in Seconds Function

,

SQL Function to calculate number of business seconds between 2 datetime fields.
Input Parameters:
@startdate - Start Time (datatype DateTime)
@enddate - End Time (datatype DateTime)
@starthour - Start of Business Day (datatype DateTime) (Format: '1900-01-01 9:00:00')
@endhour - End of Business Day (datatype DateTime) (Format: '1900-01-01 17:00:00')
@workdays - Business Day string - Use Dash ('-') for Non-Business Day (datatype char(7)) (Format: '-MTWTF-')

Note: Function does not exclude holidays.

create function dbo.f_business_seconds (@startdate datetime, @enddate datetime, @starthour datetime, @endhour datetime, @workdays varchar(7))
Returns BigInt as

BEGIN

/****************************************************************************************************************************
* SQL Server Function to determine number of business seconds between two datetime fields.
*
***************************************************************************************************************************** 
* Parameters: 
*@startdate - Start Time (datatype DateTime)
*@enddate - End Time (datatype DateTime)
*@starthour - Start of Business Day (datatype DateTime) (Format: '1900-01-01 9:00:00')
*@endhour - End of Business Day (datatype DateTime) (Format: '1900-01-01 17:00:00')
*@workdays - Business Day string - Use Dash ('-') for Non-Business Day (datatype char(7)) (Format: '-MTWTF-')
*
* Example: 
*     dbo.f_business_seconds('2005-01-10 9:00:00','2005-01-16 18:00:00','1900-01-01 9:00:00','1900-01-01 17:00:00','-MTWTF-')
*
* Returns: BigInt value that represents time in seconds
*
*****************************************************************************************************************************/
/****************************************************
* Initialize Variables
*****************************************************/
DECLARE @workstartdate datetime, @workenddate datetime, @workstarttime datetime, @workendtime datetime, @weekendflag bit, @bussecs bigint

set @workstartdate = convert(varchar,@startdate,101)
set @workenddate = convert(varchar,@enddate,101)
set @workstarttime = convert(varchar,@startdate,108)
set @workendtime = convert(varchar,@enddate,108)
set @weekendflag = 0
set @bussecs = 0

/********************************************************************************
* If Start Date is on Non-Workday then rollback start date to last workday
*********************************************************************************/
while substring(@workdays,datepart(dw,@workstartdate),1) = '-'
begin
set @weekendflag = 1 
set @workstartdate = dateadd(day,-1,@workstartdate)
end

/*******************************************************************************
* If Start Date is on Non-Workday then set start time to end of last work day
********************************************************************************/
if @weekendflag = 1
begin
set @workstarttime = @endhour
set @weekendflag = 0
end

/******************************************************************************
* If End Date is on Non-Workday then rollback end date to last workday
*******************************************************************************/
while substring(@workdays,datepart(dw,@workenddate),1) = '-'
begin
set @weekendflag = 1 
set @workenddate = dateadd(day,-1,@workenddate)
end

/*****************************************************************************
* If End Date is on Non-Workday then set end time to end of last work day
******************************************************************************/
if @weekendflag = 1
begin
set @workendtime = @endhour
set @weekendflag = 0
end

/****************************************************************************
* Adjust Start Time and End Time if outside business hours
*****************************************************************************/
if @workstarttime < @starthour
set @workstarttime = @starthour

if @workendtime < @starthour
set @workendtime = @starthour

if @workstarttime > @endhour
set @workstarttime = @endhour

if @workendtime > @endhour
set @workendtime = @endhour

/**************************************************************************
* Calculate business hours if Start Date and End Date are the same
***************************************************************************/
if @workstartdate = @workenddate
set @bussecs = datediff(second,(@workstartdate + @workstarttime),(@workenddate  + @workendtime))

/**************************************************************************
* Calculate business hours if Start Date and End Date are the different 
* but no full business days in between.
***************************************************************************/
else
begin
if @workstartdate = dateadd(day,-1,@workenddate)
set @bussecs = datediff(second,@workstarttime,@endhour) + datediff(second,@starthour,@workendtime)

/*************************************************************************
* Calculate business hours if Start Date and End Date are the different 
* and have one or more full business days in between.
**************************************************************************/
else
begin
while @workstartdate < @workenddate
begin
set @workstartdate = dateadd(day,1,@workstartdate)

if substring(@workdays,datepart(dw,@workstartdate),1) <> '-'
set @bussecs = @bussecs + datediff(second,@starthour,@endhour)
end

set @bussecs = @bussecs - datediff(second,@starthour,@endhour)
set @bussecs = @bussecs + datediff(second,@workstarttime,@endhour) + datediff(second,@starthour,@workendtime)

end
end


/**************************************************
* Return Number of Business Seconds
**************************************************/
return @bussecs
END

Read 2,056 times
(76 in last 30 days)

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating