2014-08-27 1 views
0

타임 스탬프, 즉 시작일, 종료일을 기반으로하는 데이터 세트가 있습니다. 표준 (M-F, 8-5) 주간의 시간 스탬프 사이의 영업 시간 수를 계산하고 싶습니다.타임 스탬프 간의 합계

예를 들어, 월요일 오전 8시에 티켓이 왔고 화요일 오전 9시에 문을 닫은 경우, 진술에 10 시간을 표시하고 싶습니다. 나는 또한 계산에서 주말을 생략해야합니다. 누구든지이 문제를 해결하기위한 접근법을 추천 할 수 있습니까? 도움 주셔서 감사합니다.

+0

전자에서 후자의 날짜를 빼고 시간/분으로 변환하고 작업 외 시간을 처리하는 'CASE'논리를 제안합니다. –

답변

0

예를 들어 (내 앞에 테이블 구조가 없어도) 여기 generating rows for time에 대한 다른 대답을 바탕으로 생각해 냈습니다.

declare @datetimes table (id int primary key identity(1,1), startdatetime datetime, enddatetime datetime) 
insert into @datetimes (startdatetime,enddatetime) values 
     ('2014-08-26 08:00:00','2014-08-27 09:00:00') 
    , ('2014-07-16 08:00:00','2014-07-28 09:00:00') 

declare @defaultDayStart time = '08:00:00', @defaultDayEnd time = '17:00:00' 

select T.ID, sum(Z.ShadowHours) 
from (
     select id, startdatetime, enddatetime, datediff(hh,startdatetime,enddatetime) TotalTime 
     from @datetimes 
    ) T 
    CROSS APPLY (
      SELECT 
       RowID-1 AS ShadowDays 
       , CASE 
        WHEN DATENAME(dw,DATEADD(dd, RowID - 1,t.startdatetime)) IN ('Saturday', 'Sunday') THEN 0 
        ELSE DATEDIFF(hh, CASE RowID WHEN MIN(RowID)OVER(PARTITION BY t.id) THEN t.startdatetime ELSE CONVERT(DATETIME,CONVERT(DATE, DATEADD(dd, RowID - 1,t.startdatetime))) + @defaultDayStart END 
          , CASE RowID WHEN MAX(RowID)OVER(PARTITION BY t.id) THEN t.enddatetime ELSE CONVERT(DATETIME,CONVERT(DATE, DATEADD(dd, RowID - 1,t.startdatetime))) + @defaultDayEnd END 
          ) 
       END AS ShadowHours 
       , DATENAME(dw,DATEADD(dd, RowID - 1,t.startdatetime)) wd 
      FROM (
       SELECT ROW_NUMBER()OVER(ORDER BY S.NAME) AS RowID 
       FROM master..spt_values S 
       ) X 
      WHERE DATEDIFF(dd,startdatetime,enddatetime) + 1 >= RowID 
     ) Z 
GROUP BY T.id 

이 예는 기초적이고 휴일 (예 : 휴일)이 포함 된 달력 표를 사용하지 않습니다. 또한 점심 시간에 관한 계산도하지 않습니다. 점심 시간은 8 시간 근무 일 동안 식사 중단을 허용하지 않는 것이 대부분의 장소에서 불법으로 간주되기 때문에 여기에 있어야합니다. 이것들은 당신이 이것에 적응하도록 요구받을 가능성이있는 고려 사항들입니다. 이 영역에서 도움을 받으려면 질문을 편집하고 나에게 의견을 남겨주세요.