SQL Server GROUP BY datetime은 시간 분을 무시하고 날짜 및 합계 값을 선택합니다.


86

나는 두 개의 필드와 테이블이 - datetimeint. 나는 datetime시간과 분을 무시하고 날짜에만 그룹을하고 싶다 . SELECT문은 하루의 INT의 합에 매핑되는 날짜를 반환해야합니다.


1
답변 중 하나를 받아들이는 것이 좋을 것이다 ( 단지 아스 커는 그렇게 할 수 있습니다 )
Used_By_Already

답변:


138
SELECT CAST(Datetimefield AS DATE) as DateField, SUM(intfield) as SumField
FROM MyTable
GROUP BY CAST(Datetimefield AS DATE)

11
이것은 SQL Server 2008+에서만 작동합니다 (Date 데이터 유형이 도입되었을 때). 2005 또는 이전 버전 인 경우 캐스트를 convert (convert (int, Datetimefield), datetime)로 변경하면 작동합니다.
Derek Kromm 2011 년

'Type Date가 정의 된 시스템 유형이 아닙니다'라는 오류가 표시됩니다.
Steven

5
@Steven-Derek의 의견을 참조하십시오. 이것이 질문에 VERSION 을 포함하는 것이 좋은 이유 입니다.
JNK

@Derek 이것은 작동하지 않는 것 같습니다. A는 select convert(convert(int, getdate()), datetime)잘못된 구문 오류와 함께 실패
rabudde

1
죄송합니다, 변환 (날짜, 변환 (INT, GETDATE ()))
데릭 Kromm

24

그가 사용하는 SQL 서버의 버전을 지정하지 않았기 때문에 ( date유형은 2005에서 사용할 수 없음) 다음을 사용할 수도 있습니다.

SELECT CONVERT(VARCHAR(10),date_column,112),SUM(num_col) AS summed
FROM table_name
GROUP BY CONVERT(VARCHAR(10),date_column,112)

2000/2005와 같은 이전 버전에서는 이러한 요구에 대한 varchar 변환이 사용보다 느립니다.DATEADD(dd, DATEDIFF(dd, 0, date_field),0)
Used_By_Already

7

이 작업을 수행해야하는 옵션을 조사했지만 사용하는 방법이 가장 간단하다고 생각합니다.

SELECT COUNT(*), 
       DATEADD(dd, DATEDIFF(dd, 0, date_field),0) as dtgroup 
FROM TABLE 
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, date_field),0) 
ORDER BY dtgroup ASC;

1
이는 모든 버전의 SQL Server에서 작동하며 varchar 변환을 사용하는 것보다 빠릅니다.
Used_By_Already

"dd"가 무엇인지 명확히 해주시겠습니까? 무엇을 넣어야하는지 이해가 안 돼요.
BelovedFool 2010 년

"dd"는 day에 해당하는 datepart입니다. "day", "d"또는 "dd"를 사용할 수도 있습니다
Jefferson Silva

3

-나는 이것을 데이터 유형으로 좋아하고 형식은 날짜 시간 데이터 유형과 일치합니다.

;with cte as(
    select 
        cast(utcdate as date) UtcDay, DATEPART(hour, utcdate) UtcHour, count(*) as Counts
    from dbo.mytable cd 
    where utcdate between '2014-01-14' and '2014-01-15'
    group by
        cast(utcdate as date), DATEPART(hour, utcdate)
)
select dateadd(hour, utchour, cast(utcday as datetime)) as UTCDateHour, Counts
from cte

2

개인적으로 나는 포맷 기능을 선호하므로 날짜 부분을 매우 쉽게 변경할 수 있습니다.

     declare @format varchar(100) = 'yyyy/MM/dd'
     select 
        format(the_date,@format), 
        sum(myfield) 
     from mytable 
     group by format(the_date,@format) 
     order by format(the_date,@format) desc;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.