본문 바로가기

개발관련

Mysql 특정 요일의 날짜 값 구하는 쿼리 작성법 (예: 저번주 토요일, 이번주 월요일)

반응형

만약에 저번주 금요일 오후 17:30분을 구하고자 한다면 Mysql의 WEEKDAY()라는 함수를 사용하여 구할 수 있다.

WEEKDAY()의 특징은 아래와 같다.

0 : 월요일

1 : 화요일

2 : 수요일

3 : 목요일

4 : 금요일

5 : 토요일

6 : 일요일

 

비슷한 함수로 DAYOFWEEK()라는 함수가 있다.

이 함수는 WEEKDAY()와 다르게 아래와 같이 요일 값이 계산된다.

1 : 일요일

2 : 월요일

3 : 화요일

4 : 수요일

5 : 목요일

6 : 금요일

7 : 토요일

 

특정 요일의 날짜 값을 가져오기 위해서는 DAYOFWEEK()가 아닌 WEEKDAY()를 사용해야 한다.

왜냐하면 특정 요일의 날짜를 가져오기 위해서 한 주가 지나갈 때 월요일 부터 새롭게 계산이 되어야 하는데 DAYOFWEEK()는 일요일을 기준으로 시작해 계산하기 까다롭기 때문이다.

 

따라서 이번 문서에서는 WEEKDAY()를 이용하여 다양한 요일의 날짜를 가져와 보겠다.

 

먼저 저번주 금요일의 날짜 값을 가져오기 WEEKDAY()의 특징을 살펴보면, 월요일이 0부터 시작한다는 것이다.

그리고 저번주 금요일의 날짜 값을 가져오기 위해서는

월요일 일 때, -3일

화요일 일 때, -4일

수요일 일 때, -5일

목요일 일 때, -6일

금요일 일 때, -7일

토요일 일 때, -8일

일요일 일 때, -9일

 

이 되어야지 저번주의 금요일 값을 가져올 수 있다.

위에서 특정 패턴을 확인할 수 있다.

 

월요일(0) 일 때, -3일을 하려면 :

현재날짜 - (현재요일 + 3일) →

현재날짜 - (0 + 3) →

현재날짜 -3일

 

화요일(1) 일 때, -4일을 하려면 :

현재날짜 - (현재요일 + 3일) →

현재날짜 - (1 + 3) →

현재날짜 -4일

 

수요일(2) 일 때, -5일을 하려면 :

현재날짜 - (현재요일 + 3일) →

현재날짜 - (2 + 3) →

현재날짜 -5일

...

(이하 생략)

...

일요일(6) 일 때, -9일을 하려면 :

현재날짜 - (현재요일 + 3일) →

현재날짜 - (6 + 3) →

현재날짜 -9일

 

따라서 아래와 같이 쿼리를 작성하면 위 패턴과 동일하게 전주 금요일의 날짜값을 가져올 수 있다.

SELECT DATE_FORMAT(DATE_SUB(NOW(), INTERVAL (WEEKDAY(NOW()) + 3) DAY), '%Y-%m-%d');

 

 

 

그럼 이번주 월요일의 날짜값도 구해보자.

이번주 월요일의 날짜값을 구하기 위한 패턴을 생각해보자.

이번에도 WEEKDAY()의 특성을 이용한다.

 

월요일이 0부터 시작하므로, 이번주 월요일의 날짜 값을 구하기 위해서

간단하게 현재 날짜에서 현재 요일 값을 빼면 된다.

즉, 아래와 같다.

 

월요일(0) 일 때, -0일 (그대로)

 

화요일(1) 일 때, -1일 :

현재날짜 - (현재요일) →

현재날짜 -1일

 

수요일(2) 일 때, -1일 :

현재날짜 - (현재요일) →

현재날짜 -2일

 

목요일(3) 일 때, -1일 :

현재날짜 - (현재요일) →

현재날짜 -3일

...

(이하 생략)

...

일요일(6) 일 때, -6일 :

현재날짜 - (현재요일) →

현재날짜 -6일

 

이 패턴도 아래 쿼리와 같이 작성하여 이번주 월요일의 날짜 값을 가져올 수 있다.

select DATE_FORMAT(DATE_SUB(NOW(), INTERVAL WEEKDAY(NOW()) DAY), '%Y-%m-%d');

 

이번엔 다음주 화요일을 구해보자.

다음주 화요일을 구하기 위한 패턴은 아래와 같다.

 

월요일(0) 일 때, +8일 :

현재날짜 + (8일 - 현재요일) →

현재날짜 + 8일

 

화요일(1) 일 때, +7일 :

현재날짜 + (8일 - 현재요일) →

현재날짜 + 7일

 

수요일(2) 일 때, +6일 :

현재날짜 + (8일 - 현재요일) →

현재날짜 + 6일

 

목요일(3) 일 때, +5일 :

현재날짜 + (8일 - 현재요일) →

현재날짜 + 5일

...

(이하 생략)

...

일요일(6) 일 때, +2일 :

현재날짜 + (8일 - 현재요일) →

현재날짜 +2일

 

이 패턴도 아래 쿼리와 같이 작성하여 다음주 화요일의 날짜 값을 가져올 수 있다.

select DATE_FORMAT(DATE_ADD(NOW(), INTERVAL (8 - (WEEKDAY(NOW()))) DAY), '%Y-%m-%d');

참고

 

 

How to get friday last week in MYSQL

How to get friday last week ? I have tried code the folllowing, but it not forward not backward. SELECT DATE_FORMAT(LAST_DAY(NOW()) - ((7 + WEEKDAY(LAST_DAY(NOW())) - 4) % 7), '%Y-%m-%d') last_f...

stackoverflow.com

 

 

Mysql WEEKDAY() vs Mysql DayofWeek()

I am trying to understand the both but I am getting really confused. Online it says: MySQL WEEKDAY() returns the index of the day in a week for a given date (0 for Monday, 1 for Tuesday and ........

stackoverflow.com

 

반응형