MySQL / SQL : 날짜 / 시간 열에서만 날짜별로 그룹화


182

다음과 같은 열이있는 테이블이 있습니다 mydate DATETIME...

다음과 같은 쿼리가 있습니다.

SELECT SUM(foo), mydate FROM a_table GROUP BY a_table.mydate;

datetime시간과 분을 포함한 전체 그룹으로 묶습니다. 에 의해가 YYYY/MM/DD아닌 날짜까지만 그룹을 만들고 싶습니다 YYYY/MM/DD/HH/mm.

이 작업을 수행하는 방법을 아는 사람이 있습니까? 내 코드에서 동적으로 (atm처럼) 할 수는 있지만 휴지통 코드를 정리하고 있으며 SQL을 통해 만들 수 있습니다.


1
이 답변에 설명 더 나은 방법 !
webcoder

답변:


287

날짜 시간을 날짜로 캐스트 한 후이 구문을 사용하여 GROUP BY를 사용하십시오.

SELECT SUM(foo), DATE(mydate) FROM a_table GROUP BY DATE(a_table.mydate);

또는 @ orlandu63이 제안한 것처럼 별칭으로 그룹화 할 수 있습니다.

SELECT SUM(foo), DATE(mydate) DateOnly FROM a_table GROUP BY DateOnly;

성능에 차이를 줄 것이라고 생각하지는 않지만 조금 더 명확합니다.


1
두 번째 것이 확실합니까? SQL Server에서는이 작업이 실패하고 적절한 이유로 실패합니다. 다른 곳에서도 실패 할 것으로 기대합니다. MySQL이 실제로이 쿼리를 처리하는지 확인할 수 있습니까?
Tomalak

1
방금 시도했지만 정상적으로 작동합니다. MySQL은 GROUP BY에 대해 더 관대하며 모호하지 않은 쿼리를 작성하는 것을 신뢰합니다.
Bill Karwin

정보 주셔서 감사합니다. 이것이 좋은지 아닌지는 결정할 수 없지만 MySQL에 대한 나의 의견에는 잘 맞습니다. 기술 POV에서-어떻게 작동합니까? 쿼리 파서가 GROUP BY 절의 별칭을 실제 표현식으로 대체한다고 상상할 수 있습니다.
Tomalak

17
성능 함정입니다! 이러한 함수-DATE ()를 사용하면이 열에서 인덱스를 활용할 수 없습니다.
Kamil Bednarz

나는 첫 번째 것을 사용했고 그것은 매력처럼 작동했습니다. 이 팁에 감사드립니다
Helen Neely

20

나는 월과 연도별로 그룹화해야하므로 위의 어느 것도 나를 위해 일하지 않았다는 것을 알았습니다. 대신 date_format을 사용했습니다.

SELECT date
FROM blog 
GROUP BY DATE_FORMAT(date, "%m-%y")
ORDER BY YEAR(date) DESC, MONTH(date) DESC 

2
질의가
잘못되었습니다

19

또는:

SELECT SUM(foo), DATE(mydate) mydate FROM a_table GROUP BY mydate;

더 효율적입니다 (제 생각에) 행당 두 번 mydate를 캐스팅 할 필요가 없기 때문입니다.


7
MySQL이 변환을 두 번 실행하면 매우 놀랍습니다. 그룹 별 목록의 집계 함수 및 표현식 만 그룹 별 select 문에서 허용됩니다. 엔진은 이미 두 표현식이 동일하다는 것을 알고 있어야합니다.
Tmdean

1
@Tmdean, '그룹 별리스트의 집계 함수 및 표현식 만 select 문별로 그룹화 할 수 있습니다'-쉬운 단어로 설명 할 수 있습니까?
Istiaque Ahmed

9
SELECT SUM(No), HOUR(dateofissue) 
FROM tablename 
WHERE dateofissue>='2011-07-30' 
GROUP BY HOUR(dateofissue)

특정 요일부터 합계하여 시간을 제공합니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.