2014-07-15 2 views
1

아래 쿼리는 완벽하게 작동하지만 내가 위의 쿼리의 출력어떻게 시간의 합으로 한 열을 검색 할 수

SELECT 
    USERINFO.name, USERINFO.BADGENUMBER, 
    departments.deptname, APPROVEDHRS.hours, 
    sum(workingdays) as workingdays,TotalWorkingDays 
FROM 
    (SELECT DISTINCT 
     (DATEDIFF(DAY, '2014-06-01', '2014-06-30') + 1) - 
      DATEDIFF(WEEK, '2014-06-01', '2014-06-30') * 2 - 
      (CASE WHEN DATEPART(WEEKDAY, '2014-06-01') = 5 THEN 1 ELSE 0 END) - 
      (CASE WHEN DATEPART(WEEKDAY, '2014-06-30') = 6 THEN 1 ELSE 0 END) AS TotalWorkingDays, 
     COUNT(DISTINCT DATEADD(d, 0,DATEDIFF(d, 0, CHECKINOUT.CHECKTIME))) AS workingdays, 
     USERINFO.BADGENUMBER, USERINFO.NAME, hours 
    FROM 
     USERINFO 
    LEFT JOIN 
     CHECKINOUT ON USERINFO.USERID = CHECKINOUT.USERID 
    LEFT JOIN 
     departments ON departments.deptid = userinfo.DEFAULTDEPTID 
     left join APPROVEDHRS on APPROVEDHRS.userid = userinfo.userid AND 
(APPROVEDHRS.DATE >='2014-06-01') AND (APPROVEDHRS.DATE <='2014-06-30') 
    WHERE 
     (DEPARTMENTS.DEPTNAME = 'xyz') 
     AND (CHECKINOUT.CHECKTIME >= '2014-06-01') 
     AND (CHECKINOUT.CHECKTIME <= '2014-06-30') 
    GROUP BY 
     hours, USERINFO.BADGENUMBER, deptname, USERINFO.NAME, 
     CONVERT(VARCHAR(10), CHECKINOUT.CHECKTIME, 103)) blue 
GROUP BY 
    name, BADGENUMBER, workingdays, TotalWorkingDays, deptname, hours 

을 원하지 않는 시간의 두 행 반환 :

name BADGENUMBER  deptname  hours 
--------------------------------------------------- 
abc  1111    xyz   00:07:59  
abc  1111    xyz   00:08:00  
pqr  2222    qwe   NULL 

이제 테이블의 총 시간 (APPROVEDHRS 표)입니다 : 나는 2014-06-01 20 레코드를 가져 오는하고

BADGENUMBER  NAME DATE  HOURS 
------------------------------------------------- 
1111   xyz 2014-06-15  00:07:59 
1111   xyz 2014-06-14  00:08:00 
1111   xyz 2014-07-14  00:10:00 

14-06-30 그래서 나는 아래의 출력을 원하는 :

name  BADGENUMBER  deptname  hours 
--------------------------------------------------------  
    abc  1111    xyz   00:15:59  

    pqr  2222   qwe    NULL 

도움말 날이 원하는 출력을 얻을 수 있습니다.

고맙습니다.

+0

귀하의 출력이 쿼리와 일치하지 않습니다보십시오. 'select'는 샘플 출력보다 많은 컬럼을 가지고 있습니다. –

+0

@GordonLinoff. 출력에 다른 열을 표시하지 않았습니다. 그러나 내 쿼리에 있습니다. –

+0

SQL Server에는 'time' 데이터 형식이 있지만 이것은 시간 간격 *이 아닌 * 시간을 나타냅니다. 둘 다 종종 똑같이 보일 수 있지만 논리적으로 전혀 다른 것입니다. 처음에는 하루에 두 번을 추가하는 것은 의미가 없습니다 (하루의 시간 간격을 추가하거나 두 시간 간격을 함께 추가하는 것이 좋습니다). 가장 정 확한 일은 시간, 분 또는 초로 작업 할 세분성을 결정하고 데이터를 세분화 된 총계를 나타내는'int's로 변환 한 다음'int'만으로 작업합니다. –

답변

0

GROUP BY name, badgenumber, deptname입니다.

+0

답장을 보내 주셔서 고맙겠습니다. 그러나 귀하의 제안을 보여주는 코드 샘플을 추가하십시오. –

0

Select 
name,badgenumber,deptname, 
Hours= 
    Convert(varchar,SUM(convert(int,PARSENAME(replace(hours,':','.'),3))) +SUM(convert(int,PARSENAME(replace(hours,':','.'),2))) /60)+':'+ 
    Convert(varchar,SUM(convert(int,PARSENAME(replace(hours,':','.'),2))) %60+SUM(convert(int,PARSENAME(replace(hours,':','.'),1))) /60)+':'+ 
    convert(varchar,SUM(convert(int,PARSENAME(replace(hours,':','.'),1))) %60) 
from table -- Or joining Criteria 
where isnull(date,'2014-06-01') between '2014-06-01' and '2014-06-30' 
group by name,badgenumber,deptname 
+0

15시 59 분에 1 개의 익지 않습니다. 괜찮습니다.하지만 2014-07-14 31:58에 다른 원시도 생깁니다. 0 시간 ... –

+0

u는 그룹별로 다시 말해서 – Azar

+0

이름, BADGENUMBER, 부서 이름, 시간 ... 그리고 그룹별로 시간을 삭제하면 사용 그룹에 대한 오류가 발생합니다. –

관련 문제