[MySQL] 날짜 데이터에 해당하는 주차 SQL 질문 드립니다 0 2 4,273

by 홍이 [MySQL] MySQL SQL [2018.10.08 11:17:37]


이미지1.png (188,469Bytes)

안녕하세요. MySQL에서 날짜가 있는 컬럼을 해당월에 주차로 구분하려고 합니다.

테이블에 데이터는 아래 처럼 들어가 있습니다.

SELECT DATE_FORMAT(reg_date, '%Y-%m-%d') AS `date`,
		 DATE_FORMAT(DATE_SUB(reg_date, INTERVAL (DAYOFWEEK(reg_date)-1) DAY), '%Y/%m/%d') as '이번주시작날짜',
       DATE_FORMAT(DATE_SUB(reg_date, INTERVAL (DAYOFWEEK(reg_date)-7) DAY), '%Y/%m/%d') as '이번주끝날짜',
		 WEEK(reg_date)-WEEK(DATE_ADD(reg_date, INTERVAL -DAY(reg_date)+1 DAY))+1 AS WEEK_DATE2,
		 WEEK(DATE_FORMAT(reg_date, "%Y%m%d"), 5) - WEEK(DATE_SUB(DATE_FORMAT(reg_date, "%Y%m%d"), INTERVAL DAYOFMONTH(DATE_FORMAT(reg_date, "%Y%m%d")) - 1 DAY),5) + 1 AS WEEK_DATE2
  FROM test_st
 GROUP BY date 

[결과]

date 이번주시작날짜 이번주끝날짜 WEEK_DATE2 WEEK_DATE2
2018-09-30 2018-09-30 2018-10-06 6 5
2018-10-01 2018-09-30 2018-10-06 1 1
2018-10-03 2018-09-30 2018-10-06 1 1
2018-10-07 2018-10-07 2018-10-13 2 1
2018-10-10 2018-10-07 2018-10-13 2 2
2018-10-14 2018-10-14 2018-10-20 3 2
2018-10-19 2018-10-14 2018-10-20 3 3
2018-10-21 2018-10-21 2018-10-27 4 3
2018-10-23 2018-10-21 2018-10-27 4 4
2018-10-28 2018-10-28 2018-11-03 5 4
2018-11-01 2018-10-28 2018-11-03 1 1
2018-11-04 2018-11-04 2018-11-10 2 1
2018-11-05 2018-11-04 2018-11-10 2 2

구글링으로 얻은 정보로 WEEK_DATE1과 WEEK_DATE2 2가지 방법으로 주차를 구하는 쿼리를 찾을수 있었는데 원하는 데이터가 나오지 않아 질문 드리게 되었습니다.

제가 원하는 것은 이미지 에서 빨간색으로 표시 한 것 처럼 

9/30 ~ 10/6 (일요일 ~ 토요일) 1주차

10/7 ~ 10/13 (일요일 ~ 토요일) 2주차

10/14 ~ 10/20 (일요일 ~ 토요일) 3주차

10/21 ~ 10/27 (일요일 ~ 토요일) 4주차

10/28 ~ 11/03 (일요일 ~ 토요일) 5주차

11/04 ~ 11/10 (일요일 ~ 토요일) 1주차 - 11월의

이렇게 출력이 되도록 하고 싶은데 검색을 해봐도 잘 모르겠어서 질문 드립니다.

감사합니다.

by 마농 [2018.10.08 13:04:50]

달력 테이블(연월주차 정보 포함)을 미리 만들어 두고 조인하여 사용하시면 편리합니다.


by 마농 [2018.10.08 14:36:43]
WITH test_st AS
(
SELECT '2018-09-29' reg_date
UNION ALL SELECT '2018-09-30'
UNION ALL SELECT '2018-10-01'
UNION ALL SELECT '2018-10-03'
UNION ALL SELECT '2018-10-06'
UNION ALL SELECT '2018-10-07'
UNION ALL SELECT '2018-10-10'
UNION ALL SELECT '2018-10-14'
UNION ALL SELECT '2018-10-19'
UNION ALL SELECT '2018-10-21'
UNION ALL SELECT '2018-10-23'
UNION ALL SELECT '2018-10-28'
UNION ALL SELECT '2018-10-31'
UNION ALL SELECT '2018-11-01'
UNION ALL SELECT '2018-11-02'
UNION ALL SELECT '2018-11-03'
UNION ALL SELECT '2018-11-04'
UNION ALL SELECT '2018-11-05'
)
SELECT dt
     , dt + INTERVAL (1 - DAYOFWEEK(dt)) DAY sdt
     , dt + INTERVAL (7 - DAYOFWEEK(dt)) DAY edt
     , DATE_FORMAT(ym, '%Y-%m') ym
     , FLOOR(DATEDIFF(dt
       , ym + INTERVAL (1 - DAYOFWEEK(ym)
                          + CASE WHEN DAYOFWEEK(ym) > 4 THEN 7 ELSE 0 END) DAY
       ) / 7 + 1) w
  FROM (SELECT DISTINCT
               DATE(reg_date) dt
             , DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') ym
          FROM test_st
        ) a
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입