This is very simple if you have Date(Calendar) table. First thing you join your start and end date to calendar table to get days. Than you just compare those DATENAME
to what you have in your table. Below is the sample code using table variable and DATE
(calendar) table.
DECLARE @BusHours TABLE
(
ID INT
,DayOfWeekName VARCHAR(10)
,OpeningHour VARCHAR(7)
,ClosingHOur VARCHAR(7)
)
INSERT INTO @BusHours
( ID, DayOfWeekName, OpeningHour, ClosingHour )
VALUES ( 1, 'Monday', '08:00AM', '04:00PM' )
, ( 2, 'Tuesday', '08:00AM', '04:00PM' )
, ( 3, 'Wednesday', '08:00AM', '04:00PM' )
, ( 4, 'Thursday', '08:00AM', '04:00PM' )
, ( 5, 'Friday', '08:00AM', '04:00PM' )
DECLARE @StartDate DATETIME = '04/01/2014 09:00AM'
,@EndDate DATETIME = '04/03/2014 14:00PM'
SELECT d.Date_Dt AS GivenDate
,b.ID AS DayID
,b.DayOfWeekName AS DayName
,CASE WHEN DATENAME(WEEKDAY, @StartDate) = b.DayOfWeekName
THEN DATEDIFF(hh, @StartDate,
CONVERT(DATETIME, CONVERT(VARCHAR(12), @StartDate, 101) + ' ' + b.ClosingHour))
WHEN DATENAME(WEEKDAY, @EndDate) = b.DayOfWeekName
THEN DATEDIFF(hh, CONVERT(DATETIME, CONVERT(VARCHAR(12), @EndDate, 101) + ' ' + b.OpeningHour), @EndDate)
ELSE DATEDIFF(hh, CONVERT(DATETIME, '01/01/2014' + ' ' + b.OpeningHour),
CONVERT(DATETIME, '01/01/2014' + ' ' + b.ClosingHour))
END AS HoursOperation
FROM dbo.Date AS d
JOIN @BusHours AS b
ON DATENAME(WEEKDAY, d.Date_Dt) = b.DayOfWeekName
WHERE d.Date_Dt >= CONVERT(DATE, @startDate)
AND d.Date_Dt <= CONVERT(DATE, @EndDate)
Table definition for [Date]
table at my work. Not everyone has the same implementation of it, but if you search around you can find many scripts to generate it.
CREATE TABLE [dbo].[Date]
(
[Date_Id] [int] NOT NULL
,[Date_Dt] [date] NULL
,[Date_Nm] [varchar](9) NULL
,[DayType_Cd] [varchar](7) NULL
,[DayofWeek_Nbr] [int] NULL
,[DayofWeek_Nm] [varchar](10) NULL
,[DayofMonth_Nbr] [int] NULL
,[DayofYear_Nbr] [int] NULL
,[Week_Nbr] [int] NULL
,[Week_Nm] [varchar](5) NULL
,[WeekFirstDay_Dt] [date] NULL
,[WeekLastDay_Dt] [date] NULL
,[WeekofYear_Nbr] [int] NULL
,[Month_Nbr] [int] NULL
,[Month_6_Nbr] [int] NULL
,[Month_Nm] [varchar](6) NULL
,[MonthFull_Nm] [varchar](9) NULL
,[MonthLastDay_Dt] [date] NULL
,[MonthofYear_Nbr] [int] NULL
,[Quarter_Nbr] [int] NULL
,[Quarter_Nm] [varchar](5) NULL
,[QuarterofYear_Nbr] [int] NULL
,[Year_Nbr] [int] NULL
,[Year_Nm] [varchar](4) NULL
,[FYDayofWeek_Nbr] [int] NULL
,[FYWeek_Nbr] [int] NULL
,[FYWeek_Nm] [varchar](5) NULL
,[FYWeekFirstDay_Dt] [date] NULL
,[FYWeekLastDay_Dt] [date] NULL
,[FYWeekofYear_Nbr] [int] NULL
)