quote: Originally posted by Maverick_ I am trying to figure out how the db is going to realise what counts as a "weekend" and the thing is, the database I am working with - I cannot create tables in it where I could enter e.g. 2010 weekend dates. Hm
create a function like thisIF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME ='BusinessHours' AND ROUTINE_SCHEMA = 'dbo' AND ROUTINE_TYPE='FUNCTION')DROP FUNCTION dbo.BusinessHoursGOCREATE FUNCTION dbo.BusinessHours(@StartDate datetime,@EndDate datetime)RETURNS intASBEGINDECLARE @TotalHours int;With Calendar_CTE (Date,Day,WeekDay)AS(SELECT DATEADD(dd,DATEDIFF(dd,0,@StartDate),0),DATENAME(dw,DATEADD(dd,DATEDIFF(dd,0,@StartDate),1)), CASE WHEN DATENAME(dw,DATEADD(dd,DATEDIFF(dd,0,@StartDate),1)) NOT IN ('Saturday','Sunday') THEN 1 ELSE 0 ENDUNION ALLSELECT DATEADD(dd,1,Date),DATENAME(dw,DATEADD(dd,1,Date)), CASE WHEN DATENAME(dw,DATEADD(dd,1,Date)) NOT IN ('Saturday','Sunday') THEN 1 ELSE 0 ENDFROM Calendar_CTEWHERE DATEADD(dd,1,Date) <= DATEADD(dd,DATEDIFF(dd,0,@EndDate),0))SELECT @TotalHours=SUM( CASE WHEN c.Date=DATEADD(dd,DATEDIFF(dd,0,@StartDate),0) THEN DATEDIFF(MINUTE,@StartDate,DATEADD(dd,DATEDIFF(dd,0,@StartDate),1)) WHEN c.Date=DATEADD(dd,DATEDIFF(dd,0,@EndDate),0) THEN DATEDIFF(MINUTE,DATEADD(dd,DATEDIFF(dd,0,@EndDate),0),@EndDate) ELSE 24*60 END )/60FROM Calendar_CTE cLEFT JOIN Holiday hON h.[date]= c.DateWHERE WeekDay=1AND h.[date] IS NULLOPTION (MAXRECURSION 0)RETURN @TotalHoursENDthen use it like belowSELECT e.enquiry_number, e.enquiry_desc, e.enquiry_timeFROM enquiry eINNER JOIN status sON s.enquiry_number=e.enquiry_numberWHERE dbo.BusinessHours(s.logged_date ,GETDATE()) < = 24------------------------------------------------------------------------------------------------------SQL Server MVPhttp://visakhm.blogspot.com/ |