본문 바로가기
DB/SQL

[SQL] MySQL 주차 구하기 WEEK

by 꼬바리 2021. 7. 21.

국립국어원에 따르면 사전적 기준으로 보면 한 주의 시작은 월요일, 한 주의 마지막 날은 일요일로 되어있다. 외국에서는 일부 국가에서 일요일을 시작일로 정하는 경우가 있지만 일반적으로 월요일을 시작으로 한다. 우리나라도 월요일을 시작을 하고 있지만 이상하게 달력은 일요일이 처음에 오도록 제작한다.

 

기준일에 따라 통계가 달라지기 때문에 한 주의 시작일은 중요하다. 고객의 요구사항에 맞게 월별 통계를 어떻게 보여줄 것인가는 개발자의 몫이다. 고객이 한 주의 시작을 일요일, 월요일로 요청할지 아무도 모른다. 특히 해외 프로젝트일 경우에는 재차 확인을 해야 한다.

1. 주의 시작일 월요일, 일요일 결정
2. 월이 겹치는 주의 기준은 시작일이 일요일이면 수요일, 월요일이면 목요일이
   어느 월에 속해 있는가로 결정(시작일 기준에 따른 과반)

위의 2가지 기준을 가지고 통계 쿼리를 작성해야 한다.

 

WEEK(date , mode)

MySQL에서는 WEEK() 함수를 사용하여 주어진 날짜의 '주 번호'를 가져올 수 있다. 이때 '주 번호'는 한 해의 주를 의미한다. 함수에는 첫 번째 날짜를 인수로 제공하면 번호가 반환된다. 두 번째 인수에는 한 주의 시작을 일요일, 월요일로 지정할 수 있고 또한 주 번호의 범위를 0~53, 1~53으로 지정할 수 있다.

 

일반적인 사용법

SELECT WEEK('2020-01-04') AS WEEK_NUM;
SELECT WEEK('2020-12-27') AS WEEK_NUM;

 

옵션 사용법

SELECT WEEK('2020-01-27', 7) AS WEEK_NUM;

개인, 단체, 국가에서 의사소통을 위해 정해 놓은 ISO 표준 중에는 날짜와 시각의 정의도 있다. IOS 8601에 해당 내용이 정의되어 있다. 두 번째 인수를 지정하지 않으면 WEEK() 함수는 시스템 변수에 지정된 default_week_format을 사용한다. 이 변수의 기본값은 0이다.

1월 1일에 포함된 주에 새해에 4일 이상이 있으면 1주 차이다. 그렇지 않으면 전년도의 마지막 주이고 다음 주가 1주 차이다.

 

옵션 비교

각 인수 별 다른 결과를 얻을 수 있는 간단한 예이다. 동일한 SQL을 가지고 다른 날짜를 적용하였을 때 옵션에 따라 결과가 다르다는 것을 알 수 있다.

SET @date = '2020-01-04';
SELECT
  WEEK(@date, 0) AS 'Mode 0',
  WEEK(@date, 1) AS 'Mode 1',
  WEEK(@date, 2) AS 'Mode 2',
  WEEK(@date, 3) AS 'Mode 3',
  WEEK(@date, 4) AS 'Mode 4',
  WEEK(@date, 5) AS 'Mode 5',
  WEEK(@date, 6) AS 'Mode 6',
  WEEK(@date, 7) AS 'Mode 7';

 

SET @date = '2020-01-05';
SELECT
  WEEK(@date, 0) AS 'Mode 0',
  WEEK(@date, 1) AS 'Mode 1',
  WEEK(@date, 2) AS 'Mode 2',
  WEEK(@date, 3) AS 'Mode 3',
  WEEK(@date, 4) AS 'Mode 4',
  WEEK(@date, 5) AS 'Mode 5',
  WEEK(@date, 6) AS 'Mode 6',
  WEEK(@date, 7) AS 'Mode 7';

 

SET @date = '2020-01-06';
SELECT
  WEEK(@date, 0) AS 'Mode 0',
  WEEK(@date, 1) AS 'Mode 1',
  WEEK(@date, 2) AS 'Mode 2',
  WEEK(@date, 3) AS 'Mode 3',
  WEEK(@date, 4) AS 'Mode 4',
  WEEK(@date, 5) AS 'Mode 5',
  WEEK(@date, 6) AS 'Mode 6',
  WEEK(@date, 7) AS 'Mode 7';

 

728x90
반응형

댓글