programing

MySQL에서 주별로 그룹화하는 방법

bestcode 2022. 9. 21. 00:10
반응형

MySQL에서 주별로 그룹화하는 방법

하고 있습니다.TRUNC(timestamp,'DY')이 함수는 모든 타임스탬프를 지난 일요일 자정(midnight)으로 변환합니다.MySQL에서 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

또또도 합니다.TRUNC(timestamp,'MM')타임스탬프가 발생한 달의 첫 번째 날에 타임스탬프를 자정(midnight)으로 변환합니다.MySQL 서 my음 my my my my my my my my my 。

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

★★★★★★★★★★★★★★★.DATE_FORMAT는 그 일을 알고 .WEEK(timestamp)하지만 1년 이내의 주 번호는 정말 필요 없습니다.하다

와 를 모두 사용할 수 있으며,에 기재되어 있는 두 식을 모두 사용할 수 있습니다.SELECTGROUP BY절을 클릭합니다.

너무 우아하진 않지만 기능적으로...

물론 이 두 개의 날짜 부분을 하나의 식에 결합할 수도 있습니다.

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

편집: Martin이 지적한 바와 같이, 위의 긴 공식만큼 눈에 잘 띄지 않지만, 이 기능을 사용할 수도 있습니다.


편집 2 [3년 반 후!]
YEARWEEK(mysqldatefield) 옵션인 두 번째 인수()mode를 0 또는 2로 설정하면 원하는 경우 전체 주(1월 1일에 걸친 주 포함)까지 집계하는 것이 가장 좋습니다.YEAR() / WEEK()이 답변에서 처음에 제안된 접근방식은 이러한 "스트래들링" 주에 대한 집계 데이터를 2개로 분할하는 효과가 있다. 하나는 이전 연도, 다른 하나는 새해이다.
의을 들여을 하는 이 바람직하며, 2주(약 1주)가 .YEAR() / WEEK()접근법이 더 낫습니다.

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

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

주의 는, 「을 해 주세요.-1로로 합니다.-2.


편집

몇 년이 흘렀고 마침내 이 글을 쓸 시간이 생겼다.https://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

위에서 받아들인 답변은 시간순서가 아닌 알파벳 순서로 주를 정렬했기 때문에 나에게는 효과가 없었습니다.

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

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

이번 주 초에 실제 타임스탬프가 필요한 경우 다음과 같이 하십시오.

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

월별 주문은 LAST_DAY() 함수를 고려해 주십시오.- 정렬은 월의 마지막 날까지입니다만, 그것은 월의 첫 날에 정렬하는 것과 같습니다.

선택에서 이것을 광고해 주세요.

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

그리고.

group_by(week);

"주말" 날짜가 필요한 경우 이 방법도 사용할 수 있습니다.이것은 각 주의 레코드 수를 카운트합니다.예제:2010년 1/2과 2010년 1/8과 5 사이에 (포함)1/9와 2010년 1/16 사이에 3개의 워크오더가 작성되면 다음과 같이 반환됩니다.

/ / 8 / 3 / 2010 / 8일
16일 5월 16일

datetime 필드를 잘라내기 위해 추가 DATE() 함수를 사용해야 했습니다.

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;

이전 일요일:

STR_TO_DATE(CONCAT(YEARWEEK(timestamp,2),'0'),'%X%V%w')

지난 월요일:

STR_TO_DATE(CONCAT(YEARWEEK(timestamp,3),'1'),'%x%v%w')

DATE_FORMAT(date,format) 참조:

  • %V- Week (01..53) : 일요일은 주의 첫 번째 요일, WEEK() 모드2, 와 함께 사용합니다.%X
  • %v- Week (01 . 53) : 월요일은 주의 첫 번째 요일, WEEK() 모드3, 와 함께 사용합니다.%x
  • %w(0 요일(0=요일..)6=토요일)
  • %X첫 네 . - 요일 、 、 、 、 、 、 、 、 、 자 - 、 - - - - - - - - - - - - - - -와 함께 합니다.%V
  • %x의 첫 ), - 와 함께 합니다.%v

MySQL의 week 함수는 좋지만, 저로서는 몇 주째인지 알고 싶었습니다.이 솔루션은 다음과 같습니다.

서 ''는run_date입니다.2021-02-25 00:00:00

concat ( 
        date_format(run_date, '%Y-%m'), 
        ' wk ', 
        (week(run_date,1) - ( week(date_format(run_date, '%Y-%m-01')) - 1))
        ) as formatted_date

출력은 다음과 같습니다.

2021-02-23 --->    2021-02 wk 4
2021-02-25 --->    2021-02 wk 4
2021-02-11 --->    2021-02 wk 2
2021-03-02 --->    2021-03 wk 1

이 배경에는 해당 월의 몇 가 발생했는지(상대적으로 확실하게) 알고 싶다는 생각이 있습니다.

연결:

date_format(run_date, '%Y-%m')2021-02

, 그 에 문자 '먹다'를 .wk

씁니다.week(run_date, 1)1을 시작하기 이의 ( ( ( ( ( ) ) ) 월 to to그그 ( ) )7중 , 달 첫에 뺄 수 있기 입니다.week()★★★★★★에2021-02-01입니다.

(week(date_format(run_date, '%Y-%m-01'))

안타깝게도 0부터 카운트하기 시작하는데, 이는 사람들이 좋아하지 않기 때문에 연결 결과의 마지막 부분에서 1을 빼서 "주"가 1에서 시작되도록 합니다.

이것은 좋은 옵션일 수 있습니다.

SELECT
 year(datetime_field) as year_date, week(datetime_field) as week_date
FROM
 bd.table
GROUP BY
 year_date, week_date;

다음과 같습니다.

  • '2020', '14'
  • '2020', '15'
  • '2020', '16'
  • '2020', '17'
  • '2020', '18'

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

반응형