을 도움이되기를 바랍니다. 단일 선택 문. 각 단계를 하나의 항목으로 나눠서 어떻게 작동하는지 확인할 수있었습니다. 당신은 시간을 알아 내기 위해 마지막 칼럼 만 필요합니다. 그것은 locale에 종속적인데, datename을 사용하기 때문입니다. 그러나 DATEFIRST가 무엇인지를 아는 한, 이것을 요일로 바꿀 수 있습니다.
또한 공휴일은 포함되지 않습니다. 자신 만의 휴가 테이블을 만들어야합니다. 나는 당신이 최종 공식에 그것을 연결할 수있는 곳을 언급한다.
시작일과 종료일을 원하는대로 설정 한 다음 코드에서 사용하고 찾기/바꾸기를 수행하고 필드 이름으로 대체하십시오. SQL Server 2008 이상을 사용하는 경우 열기/닫기 시간을 시간 데이터 유형으로 전환하여 많은 부분을 단순화 할 수 있습니다. 희망이 도움이!
declare @startDate datetime = '2013-09-05 10:45:00.000',
@endDate datetime = '2013-09-06 08:15:00.000',
@zeroDate datetime = '1900-01-01 00:00:00.000',
@businessOpen datetime = '1900-01-01 08:00:00.000',
@businessClose datetime = '1900-01-01 17:00:00.000',
@hoursOpen int;
select @hoursOpen = datediff(hour, @businessOpen, @businessClose);
select @hoursOpen as hoursOpen
, @endDate - @startDate as actualTimeCallOpen
, datediff(week, @startDate, @endDate) as wholeWeekendsCallOpen
, datediff(day, @startDate, @endDate) as daysCallOpen
, (DATEDIFF(dd, @StartDate, @EndDate)) --get days apart
-(DATEDIFF(wk, @StartDate, @EndDate) * 2) --subtract whole weekends from the date (*2 is for 2 days per weekend)
+(CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) --subtract the start date if it started on sunday (thus, partial weekend)
-(CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) --subtract the end date if it ends on saturday (again, partial weekend)
as MthruFDaysOpen
, datediff(hour, @startDate, @endDate) as timeHoursCallOpen
, datediff(minute, @businessOpen, convert(datetime, '1900-01-01 ' + convert(varchar(8),@startDate,108)))/60.0 as hoursOpenBeforeCall
, datediff(minute, convert(datetime, '1900-01-01 ' + convert(varchar(8), @endDate, 108)), @businessClose)/60.0 as hoursOpenAfterCall
, (@hoursOpen - ((datediff(minute, convert(datetime, '1900-01-01 ' + convert(varchar(8), @endDate, 108)), @businessClose) + datediff(minute, @businessOpen, convert(datetime, '1900-01-01 ' + convert(varchar(8),@startDate,108))))/60.0)) as partialHourDay
, (((DATEDIFF(dd, @StartDate, @EndDate)) --get days apart,
- (DATEDIFF(wk, @StartDate, @EndDate) * 2) --subtract whole weekends from the date
+ (CASE WHEN DATENAME(dw, @StartDate) = 'Sunday' THEN 1 ELSE 0 END) --subtract the start date if it started on sunday (thus, partial weekend)
- (CASE WHEN DATENAME(dw, @EndDate) = 'Saturday' THEN 1 ELSE 0 END) --subtract the end date if it ends on saturday (again, partial weekend)
--If you have a table with holidays in it, you can subtract the count of holidays from this as well
--test where the holiday is between startdate and end date and the holiday itself isn't a saturday or sunday
) * @hoursOpen) --multiply the whole days open times hours per day, giving us
+ (@hoursOpen --start with hours open
- (-- then subtract the sum of hours the business was open before and after the call
(datediff(minute, convert(datetime, '1900-01-01 ' + convert(varchar(8), @endDate, 108)), @businessClose) --calculate this different in minutes for greater accuracy
+ datediff(minute, @businessOpen, convert(datetime, '1900-01-01 ' + convert(varchar(8),@startDate,108)))
)/60.0) --divide by 60 to convert back to hours before subtracting from @hours open
) as businessTimeOpen
감사합니다. 요한 나는 멍청 할 것입니다. :) –