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년 이내의 주 번호는 정말 필요 없습니다.하다
와 를 모두 사용할 수 있으며,에 기재되어 있는 두 식을 모두 사용할 수 있습니다.SELECT
및GROUP 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')
%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
'programing' 카테고리의 다른 글
mariadb 사용자에게 데이터베이스 생성 권한 부여 (0) | 2022.09.21 |
---|---|
1052년:필드 목록 열에 'id'라고 애매한 것이다. (0) | 2022.09.21 |
FreeBSD 분기 바이너리 mariadb101-server가 없습니다. 이유가 무엇입니까? (0) | 2022.09.21 |
새로운 판다 칼럼을 만들기 위해 여러 인수가 있는 기능 적용 (0) | 2022.09.21 |
도커 마리아 데이터베이스에 접속하려면 어떻게 해야 하나요? (0) | 2022.09.21 |