Programing

MySQL에서 주별로 그룹화하는 방법은 무엇입니까?

lottogame 2020. 10. 16. 07:03
반응형

MySQL에서 주별로 그룹화하는 방법은 무엇입니까?


Oracle의 테이블 서버는 내장 기능인 TRUNC(timestamp,'DY'). 이 함수는 모든 타임 스탬프를 이전 일요일의 자정으로 변환합니다. MySQL에서이를 수행하는 가장 좋은 방법은 무엇입니까?

오라클은 TRUNC(timestamp,'MM')타임 스탬프가 발생하는 달의 1 일 자정으로 변환 할 수도 있습니다 . MySQL에서 이것은 간단합니다.

TIMESTAMP(DATE_FORMAT(timestamp, '%Y-%m-01'))

그러나이 DATE_FORMAT트릭은 몇 주 동안 작동하지 않습니다. 나는 그 WEEK(timestamp)기능을 알고있다 . 그러나 나는 정말로 1 년 안에 주 번호를 원하지 않는다. 이 물건은 다년간의 작업입니다.


YEAR(timestamp)및을 모두 사용할 수 있으며 WEEK(timestamp)에서 이러한 식을 모두 사용할 수 있습니다 .SELECTGROUP BY

지나치게 우아하지는 않지만 기능적 ...

물론이 두 날짜 부분을 단일 표현식으로 결합 할 수도 있습니다.

SELECT CONCAT(YEAR(timestamp), '/', WEEK(timestamp)), etc...
FROM ...
WHERE ..
GROUP BY CONCAT(YEAR(timestamp), '/', WEEK(timestamp))

편집 : Martin이 지적했듯이YEARWEEK(mysqldatefield) , 그 결과는 위의 긴 공식만큼 눈에 친숙하지는 않지만 함수 를 사용할 수도 있습니다 .


편집 2 [3 1/2 년 후!] :
YEARWEEK(mysqldatefield)선택 사항 인 두 번째 인수 ( mode)를 0 또는 2로 설정하는 것이 아마도 완전한 주 단위 로 집계하는 가장 좋은 방법 일 것입니다 (즉, 1 월 1 일에 걸쳐있는 주 포함). 원하는 것. YEAR() / WEEK()처음이 답변에서 제안 된 접근 방식은 분할의 효과 등의 집계 데이터가 "벌리고" 이전 해 하나, 새해과 하나 : 두 주.
회계 등에서 최대 2 주를 부분적으로 처리하는 비용으로 매년 깔끔하게 절단하는 것이 바람직하며 그에 대한 YEAR() / WEEK()접근 방식이 더 좋습니다.


위의 대답은 시간 순서가 아닌 알파벳 순서로 주를 정렬했기 때문에 저에게 효과적이지 않았습니다.

2012/1
2012/10
2012/11
...
2012/19
2012/2

다음은 주 단위로 계산하고 그룹화하는 솔루션입니다.

SELECT CONCAT(YEAR(date), '/', WEEK(date)) AS week_name, 
       YEAR(date), WEEK(date), COUNT(*)
FROM column_name
GROUP BY week_name
ORDER BY YEAR(DATE) ASC, WEEK(date) ASC

생성 :

YEAR/WEEK   YEAR   WEEK   COUNT
2011/51     2011    51      15
2011/52     2011    52      14
2012/1      2012    1       20
2012/2      2012    2       14
2012/3      2012    3       19
2012/4      2012    4       19

알아 냈어 ... 조금 번거롭지 만 여기 있습니다.

FROM_DAYS(TO_DAYS(TIMESTAMP) -MOD(TO_DAYS(TIMESTAMP) -1, 7))

비즈니스 규칙에 따라 주가 월요일에 시작된다고되어 있으면 -1-2.


편집하다

몇 년이 지났고 마침내 나는 이것을 작성했습니다. http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/


YEARWEEK () 함수를 사용하여 연결된 연도와 주 번호 (200945)를 얻을 수 있습니다 . 목표를 올바르게 이해하면 다년 데이터를 그룹화 할 수 있습니다.

한주의 시작에 대한 실제 타임 스탬프가 필요한 경우 그다지 좋지 않습니다.

DATE_SUB( field, INTERVAL DAYOFWEEK( field ) - 1 DAY )

For monthly ordering, you might consider the LAST_DAY() function - sort would be by last day of the month, but that should be equivalent to sorting by first day of the month ... shouldn't it?


Just ad this in the select :

DATE_FORMAT($yourDate, \'%X %V\') as week

And

group_by(week);

If you need the "week ending" date this will work as well. This will count the number of records for each week. Example: If three work orders were created between (inclusive) 1/2/2010 and 1/8/2010 and 5 were created between (inclusive) 1/9/2010 and 1/16/2010 this would return:

3 1/8/2010
5 1/16/2010

I had to use the extra DATE() function to truncate my datetime field.

SELECT COUNT(*), DATE_ADD( DATE(wo.date_created), INTERVAL (7 - DAYOFWEEK( wo.date_created )) DAY) week_ending FROM work_order wo GROUP BY week_ending;

참고URL : https://stackoverflow.com/questions/1736010/how-to-group-by-week-in-mysql

반응형