Click here to Skip to main content
15,883,901 members
Please Sign up or sign in to vote.
4.33/5 (2 votes)
Hi ,

How to calculate time in between date.

i have a two table
1. plan issue receive Master
2. Plan Submit Master

-> Plan Issue to employee on '2014-01-02 08:30:00.000'

-> in this one employee submit the plan in plan mater on this time '2014-01-04 18:20:00.000'

-> our office timing is 10 hours

-> i want calculate only working hours time.

so how is it possible in query.

Thank you ,.
Posted
Comments
Sergey Vaselenko 8-Jan-14 6:29am    
Is it 10 hours a day in any time frame?
Or you have working hours (from .. till ..)?
What about weekends and holidays?
RKparmar 8-Jan-14 6:46am    
from : at 8:00 AM to 7:00 PM and Sunday is holidays.
Maciej Los 8-Jan-14 9:35am    
There are other holidays... How about them?

Try this code, please.

It calculates and adds hours of the first day, last day, and the entire days in the period.
But holidays and weekends are not used.

Also this code calculates hours, not minutes.

DECLARE @PlanIssueDate AS datetime
DECLARE @PlanSubmitDate AS datetime

SET @PlanIssueDate = '2014-01-02 08:30:00.000'
SET @PlanSubmitDate = '2014-01-04 18:20:00.000'

SELECT
	-- Testing
	DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) AS [TestDays]			
	, DATEDIFF(HOUR, @PlanIssueDate, @PlanSubmitDate) AS [TestHours]
	, DATEDIFF(HOUR, DATEADD(HOUR, DATEPART(HOUR, @PlanIssueDate), 0), DATEADD(HOUR, 19, 0)) AS FirstDayHours
	, DATEDIFF(HOUR, DATEADD(HOUR, 8, 0), DATEADD(HOUR, DATEPART(HOUR, @PlanSubmitDate), 0)) AS LastDayHours
	, CASE WHEN DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) < 2 THEN 0
		ELSE (DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) - 1) * 10		-- 10 hours per day for days between
		END AS MidDayHours

	-- Result
	, CASE
		WHEN DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) = 0 THEN		-- ends in the same day
			CASE
				WHEN DATEDIFF(HOUR, @PlanIssueDate, @PlanSubmitDate) > 10 THEN 10
				ELSE DATEDIFF(HOUR, @PlanIssueDate, @PlanSubmitDate)
				END
		ELSE																		-- ends on other day
			CASE WHEN DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) < 2 THEN 0
				ELSE (DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) - 1) * 10		
				END																	-- 10 hours per day for days between
			+ CASE
				WHEN DATEDIFF(HOUR, DATEADD(HOUR, DATEPART(HOUR, @PlanIssueDate), 0), DATEADD(HOUR, 19, 0)) > 10 THEN 10
				ELSE DATEDIFF(HOUR, DATEADD(HOUR, DATEPART(HOUR, @PlanIssueDate), 0), DATEADD(HOUR, 19, 0))
				END																	-- Hours for the first day
			+ CASE
				WHEN DATEDIFF(HOUR, DATEADD(HOUR, 8, 0), DATEADD(HOUR, DATEPART(HOUR, @PlanSubmitDate), 0)) > 10 THEN 10
				ELSE DATEDIFF(HOUR, DATEADD(HOUR, 8, 0), DATEADD(HOUR, DATEPART(HOUR, @PlanSubmitDate), 0))
				END																	-- Hours for the last day
		END AS [Hours]
 
Share this answer
 
Try this code in minutes. It is much simpler.
DECLARE @PlanIssueDate AS datetime
DECLARE @PlanSubmitDate AS datetime

SET @PlanIssueDate = '2014-01-02 08:30:00.000'
SET @PlanSubmitDate = '2014-01-04 18:20:00.000'

SELECT
	-- Testing
	DATEDIFF(MINUTE, @PlanIssueDate, @PlanSubmitDate) AS TotalMinutes
	, DATEPART(HOUR, @PlanIssueDate) * 60 + DATEPART(MINUTE, @PlanIssueDate) - 8 * 60 AS FirstDayMinutes
	, CASE WHEN DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) < 2 THEN 0
		ELSE (DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) - 1) * 10 * 60
		END AS MidDayMinutes
	, DATEPART(HOUR, @PlanSubmitDate) * 60 + DATEPART(MINUTE, @PlanSubmitDate) - 8 * 60 AS LastDayMinutes

	-- Result
	, CASE
		WHEN DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) = 0 THEN		-- ends in the same day
			CASE
				WHEN DATEDIFF(MINUTE, @PlanIssueDate, @PlanSubmitDate) > 10 THEN 10 * 60
				ELSE DATEDIFF(MINUTE, @PlanIssueDate, @PlanSubmitDate)
				END
		ELSE																		-- ends on other day
			CASE WHEN DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) < 2 THEN 0
				ELSE (DATEDIFF(DAY, @PlanIssueDate, @PlanSubmitDate) - 1) * 10 * 60
				END																	-- 10 hours per day for days between
			+ CASE
				WHEN DATEPART(HOUR, @PlanIssueDate) * 60 + DATEPART(MINUTE, @PlanIssueDate) - 8 * 60 > 600 THEN 600
				ELSE DATEPART(HOUR, @PlanIssueDate) * 60 + DATEPART(MINUTE, @PlanIssueDate) - 8 * 60
				END																	-- Minutes for the first day
			+ CASE
				WHEN DATEPART(HOUR, @PlanSubmitDate) * 60 + DATEPART(MINUTE, @PlanSubmitDate) - 8 * 60 > 600 THEN 600
				ELSE DATEPART(HOUR, @PlanSubmitDate) * 60 + DATEPART(MINUTE, @PlanSubmitDate) - 8 * 60
				END																	-- Minutes for the last day
		END AS [Minutes]
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900