2012-07-17 3 views
0

직원의 일일 프로그램을 보여주는 테이블이 있습니다.하루에 1 레코드를 얻는 것은 2 개의 다른 레코드를 포함합니다.

SELECT COUNT(*) AS TotalDay FROM [User] 
    INNER JOIN [x] ON [x].UserID = [User].ID 
WHERE  
     StartTime BETWEEN '20120611' AND '20120618' AND UserID = 20 
GROUP BY [User].ID, [User].Name 
ORDER BY Name 

7 개의 레코드가 반환됩니다. 하루에 한 명의 사용자 (UserID)가 두 곳으로 갈 수 있기 때문입니다.

예를 들어, 사용자는이 20,120,611 20,120,611 13시 30분 0초 에 8시 30분 0초에서 이루어 가고 20,120,611 19시 0분 0초

에 20,120,611 14시 0분 0초에서 B 장소 갔다 이 쿼리를 사용하면 2 레코드를 반환합니다.

SELECT COUNT(*) AS TotalDay FROM [User] 
    INNER JOIN [x] ON [x].UserID = [User].ID 
WHERE  
     StartTime = '20120611' AND UserID = 20 
GROUP BY [User].ID, [User].Name 
ORDER BY Name 

그러나 작업이 하루에 있었기 때문에 하나의 레코드를 얻고 싶습니다.

어떻게받을 수 있습니까?

나는 MSSQL을 사용합니다. StartTime은 sql의 datetime입니다.

+0

귀하의 쿼리에 따라 총 연산이 계산됩니다. 별개의 일수를 찾고 있다면 두 번째 쿼리에서 count (*) 대신'count (distinct starttime)'을 사용할 수 있습니다. 나를 교정하십시오 내가 잘못하면 .. –

+0

날짜와 시간 부분을 두 개의 열에 보관하고 있습니까? 두 번째 쿼리는 시간이 StartTime의 일부일 경우 0을 반환하기 때문에 묻습니다. 스키마를 좀 더 명확하게 설명해 주시겠습니까? –

답변

0

시도 :

DATEADD(DD, DATEDIFF(DD, 0, STARTTIME), 0) BETWEEN DATEADD(DD, DATEDIFF(DD, 0, <DATE_TIME_PARAMETER>), 0) AND DATEADD(DD, DATEDIFF(DD, 0, <DATE_TIME_PARAMETER>), 0) 

당신은 또한 그룹에 위에서 언급 한 날짜 부분을 기준으로 결과가 필요합니다.

0

당신은 datepart로 그룹화해야합니까? 당신의 where 절에 다음과

SELECT COUNT(*) AS TotalDay FROM [User] 
INNER JOIN [x] ON [x].UserID = [User].ID 
WHERE  
    StartTime = '20120611' AND UserID = 20 
GROUP BY [User].ID, [User].Name, cast(floor(cast(starttime as float)) as datetime) 
ORDER BY Name 
+0

캐스팅은 적용된 모든 색인을 무시하고 쿼리를 느리게 만듭니다. – danish

+0

그는 datepart별로 그룹화하기를 원하며이 캐스트는 그것을 얻는 가장 빠른 방법입니다 ... –

+0

'FLOAT'에 대한'CAST'는 SQL Server 2008을 사용하여 시간 부분을 제거하는 가장 빠른 방법은 아닙니다 쿼리의 'CAST (StartTime AS DATE)'입니다. Datetime은 믿을 수있는만큼 float가 아닌 2 개의 부호없는 정수로 저장되므로 날짜 사이에 캐스팅하면 형식 간 변환을 피할 수 있습니다. @danish가 사용했던'DATEADD/DATEDIFF' 메쏘드도 같은 이점을 가지고 있습니다. – GarethD

관련 문제