2016-08-29 5 views
0

날짜가 지정된 (datetime) 및 날짜가 확인 된 (datetime) 테이블이 있습니다.SQL Server 2012 - 주말을 제외하고 두 datetimes 사이의 근무 시간 동안 경과 시간 계산

근무 시간 동안 경과하고 주말을 제외한 시간 (초)을 계산하려고합니다.

노동 시간은 월요일부터 금요일까지 09 : 00 : 00.000000에서 17 : 30 : 00.000000입니다.

금요일에 프로젝트가 금요일 16시 : 00.000000에 할당되고 월요일 10시 30 분 00.000000에 해결 된 경우 총 경과 시간은 3 시간 또는 180 분 또는 10,800 초가됩니다.

나는 주말 시간을 제외했지만 근무 시간이 아닌 게시물을 보았습니다. 어떤 도움을 주셔서 감사합니다.

+0

근무 시간이 고정되어 있습니까? 변하지 않니? 그들은 계속되는가 (점심 시간 없음)? –

+1

공휴일은 어떨까요? –

+0

근무 시간은 고정되어 있으며이 경우 휴일을 무시합니다. 감사합니다! – FBeveridge

답변

0

이 작업을 시도 할 수 있습니다 : 그것은 하나의 표현에이 모든 것을 할 수있을 수도 있지만

select datediff(hh, @d1, @d2) - (datediff(wk, @d1, @d2) * 2 * 8.5) - datediff(dd, @d1, @d2) * (24-8.5) 
+0

감사합니다 @ Polux2 내가 이것을 실행하면 음의 정수로 끝납니다 ...이 문장이 무엇을하는지 자세히 설명해 주시겠습니까? 감사! – FBeveridge

+0

'@ d2> @ d1'과 (과) 확실합니까? 그것은 내 컴퓨터에서 위대한 작품이다. 시간 대신 분으로 작업하는 것을 선호한다면 hh를 mi ("2 * 8.5 * 60"및 "(24-8.5)"및 "(24-8.5) * 60" – Polux2

0

, 나는 그것을 시도하지 않을 것입니다. 너무나 많은 사람의 실수 (전사 오류 포함), 매우 길고, 디버깅이나 수정이 까다 롭습니다.

대신 이미 계산 된 데이터 집합을 반환해야한다면 T-SQL의 사용자 정의 함수로 사용합니다. 이 정보를 표시하거나 보고서를 작성하려고한다면 코드로 수행하는 것이 좋습니다. 그러나 사용자 정의 된 T-SQL 함수가 가장 유연한 솔루션이 될 것입니다.

아직 손을 쓸만한 것이 없으므로 알고리즘을 알려 드리겠습니다.

@ Date1과 @ Date2라는 두 개의 날짜 - 시간 값이 있다고 가정합니다. 우리는 @ Date1 < @ Date2라고 가정합니다. @ Date1과 @ Date2는 모두 근무일 및 근무 시간 내에 있다고 가정합니다.

@ Date1과 @ Date2가 같은 날짜 인 경우 @ Date1과 @ Date2의 차이를 초 단위로 반환하십시오.

@firstMorning을 @ Date1의 첫 9시 이후로 지정하십시오. @ Date1이 오전 9시에 있으면 @firstMorning = @ Date1입니다.

@lastMorning을 @firstMorning 다음 @ Date2 앞의 마지막 오전 9 시로 지정하십시오. (기본적으로 @ Date2의 시작 시간입니다.)

@workWeeks = @firstMorning과 @lastMorning 사이의 월요일 - 금요일 주 수로 둡니다.

Let @firstWeekDays = @firstMorning과 금요일 오전 9:00 사이의 일 수. @firstMorning = Friday 오전 9:00 일 경우 @firstWeekDays를 0으로 설정하십시오.

Let @lastWeekDays = 지난주 월요일의 오전 9시와 @lastMorning 사이의 일 수. @lastMorning = Monday 오전 9:00 일 경우 @lastWeekDays를 0으로 설정하십시오.

Let @SecondsPerDay = 8.5 * 3600.

반환 (@workWeeks * 5 * @SecondsPerDay) + (@firstWeekDays * @SecondsPerDay) + (@ 날짜 1에 @ 날짜 1 5:30 사이의 시간 (초)) + (@lastWeekDays * @SecondsPerDay) + (초 사이 @lastMorning 및 @ Date2)

이 논리는 코드로 테스트되지 않았 음을 유의하십시오. 코드가 있으면이 코드를 사용합니다. :)