mariaDB 날짜관련 함수 모음 정리 (feat. 날짜포멧, 현재날짜등)

mariaDB 날짜관련 함수 모음 정리

최근  mariaDB를 사용 할 일이 많아졌다. 그러다가 아주 간단한 날짜형식같은 것들도 까먹는 경우가 생겨서 매번 찾아보기 귀찮아서 이렇게 정리를 한다. 막 기억이 안나서 SUBSTR같은 함수로 잘라서 사용하는 지저분한 쿼리 말고 될수있으면 지원되는 함수를 사용하여 최대한 깔끔한 쿼리를 작성하는 방향으로 연습하자.

CURRENT_DATE, CURDATE()

현재 년월일을 출력한다. CURRENT_DATE 같은 경우 괄호가 필요없으며 CURDATE()의 경우 괄호가 필요하다. 둘다 출려되는 내용은 같다. 조금이라도 길이가 짧은 CURDATE()를 대부분 선호하는 편이다.

특정한 포멧을 지정하지 않으면 y-m-d 가 기본 포멧이다.

  • 실행
SELECT CURRENT_DATE AS C_D, CURDATE() AS CD FROM DUAL
  • 결과
"2022-06-30"	"2022-06-30"

CURRENT_TIME, CURTIME()

현재 시분초를 출력한다. CURRENT_TIME 같은 경우 괄호가 필요없으며 CURTIME()의 경우 괄호가 필요하다. 둘다 출려되는 내용은 같다. 조금이라도 길이가 짧은 CURTIME()를 대부분 선호하는 편이다.

특별한 포멧을 지정하지 않으면 h:m:s 가 기본 포멧이다.

  • 실행
SELECT CURRENT_TIME AS C_T, CURTIME() AS CT FROM DUAL
  • 결과
"14:42:36"	"14:42:36"

NOW()

현재 년월일시분초 를 출력한다. CURDATE() + CURTIME() 이라고 생각해도 된다.

특별히 현재년월일을 출력하거나 현재시분초를 출력하는 것이 아니라면 NOW()를 사용하는 편이 입맛에 맞게 변환하기가 좋다. 

  • 실행
SELECT NOW() FROM DUAL
  • 결과
2022-06-30 14:43:48

YEAR(), MONTH(), DAY()

기준날짜에서 YEAR() 는 년도, MONTH() 는 월, DAY는 일을 표기한다. 예시로 NOW()를 기준으로 뒀는데, 만약 20221231이 기준이라면 YEAR() == 2022, MONTH() == 12, DAY() == 31 을 출력해 줄것이다.

  • 실행
SELECT YEAR(NOW()), MONTH(NOW()), DAY(NOW()) FROM DUAL
  • 결과
"2022" "6" "30"

 

DATE_ADD()

특정 날짜를 더하거나 뺄때 사용한다. 사용법은 아주 간단해서 숫자를 입력하고 뒤에 년월일 시분초 를 입력하면 입력한 만큼의 기간을 계산해서 보여준다. 기간별 검색이나 특정 구간의 날짜만 검색할때 아주 유용하게 쓰인다.

  • 실행
SELECT 
	NOW() AS N
	, DATE_ADD(NOW(), INTERVAL 2 HOUR) AS PH
	, DATE_ADD(NOW(), INTERVAL -2 HOUR) AS MH
	, DATE_ADD(NOW(), INTERVAL 5 DAY) AS PD
	, DATE_ADD(NOW(), INTERVAL -5 DAY) AS MD
FROM DUAL;
  • 결과
"2022-06-30 14:55:59"	"2022-06-30 16:55:59"	"2022-06-30 12:55:59"	"2022-07-05 14:55:59"	"2022-06-25 14:55:59"

DATE_SUB()

DATE_ADD()와 반대로 표기한 숫자만 큼 뺀다. 

DATE_SUB(NOW(), INTERVAL 2 HOUR) 와 DATE_SUB(NOW(), INTERVAL -2 HOUR) 는 같은 뜻이다.

 

  • 실행
SELECT 
	NOW() AS N
	, DATE_SUB(NOW(), INTERVAL 2 HOUR) AS PH
	, DATE_SUB(NOW(), INTERVAL -2 HOUR) AS MH
	, DATE_SUB(NOW(), INTERVAL 5 DAY) AS PD
	, DATE_SUB(NOW(), INTERVAL -5 DAY) AS MD
FROM DUAL;
  • 결과
"2022-06-30 14:57:16"	"2022-06-30 12:57:16"	"2022-06-30 16:57:16"	"2022-06-25 14:57:16"	"2022-07-05 14:57:16"

DAY, DAYOFWEEK()

DAY는 기준년월일에서 일을 가져오고 DAYOFWEEK()은 기준월에 속해있는 주간이 몇개나 되는지 출력한다. 

이 글을 작성한 날짜가 2022년 07월 01일인데 7월의 경우 총 6주차까지 있다. 달력을 만드는 쿼리나 주차계산하는 쿼리를 작성할때 매우 유용하다.

  • 실행
SELECT NOW() AS N, DAY(NOW()) D, DAYOFWEEK(NOW()) AS DW FROM DUAL;
  • 결과
"2022-07-01 13:54:10" "1" "6"

 

WEEKDAY()

위에 작성했던 DAYOFWEEK()와 같은 역할을 하지만 차이점은 DAYOFWEEK()은 일요일부터 시작하는 반면, WEEKDAY()의 경우 한주의 시작이 월요일부터 시작이다.

  • 실행
SELECT WEEKDAY(NOW()) D FROM DUAL
  • 결과
4

DAYOFYEAR()

기준날짜가 해당 연도의 몇일째 인가 출력할때 사용한다. 날짜계산할때 편하게 사용 할 수있다.

  • 실행
SELECT DAYOFYEAR(CURDATE()) D FROM DUAL
  • 결과
182

QUARTER()

1년을 4쿼터로 나눠서 기준날짜가 몇번째 분기인지 표시할 수있다. 표기된 날짜가 몇번째 분기인지 표기해준다. 

예) 1,2,3월 == 1분기, 4,5,6월 == 2분기, 7,8,9월 == 3분기, 10,11,12월 == 4분기

  • 실행
SELECT QUARTER(NOW()) D FROM DUAL
  • 결과
3

HOUR(), MINUTE(), SECOND()

입력된 시분초에서 순서대로 시간, 분, 초를 따로 출력할수있다. 만약 특정한 포멧이 지정되지 않는다면 24시표기 형태로 출력이 된다. 

  • 실행
SELECT HOUR(NOW()) H , MINUTE(NOW()) M , SECOND(NOW()) S FROM DUAL
  • 결과
"13" "9" "42"

DATE_FORMAT()

출력되는 년월일시분초의 형태를 지정 할수있다.

예시로 표기한 것외에도 매우 다양한 형태로 표기 할수있으니 자세한 내용은 링크된 페이지에서 확인하도록 하자.

https://mariadb.com/kb/en/date_format/

 

DATE_FORMAT

Formats the date value according to the format string.

mariadb.com

사실상 내가 생각한 모든 형태로 년월일시분초 표기가 가능하다.

  • 실행
SELECT DATE_FORMAT(CURDATE(), '%y-%m-%d %r') a
	, DATE_FORMAT(CURDATE(), '%y-%m-%d %h:%m:%s') a_1
	, DATE_FORMAT(CURDATE(), '%Y-%M-%D %r') b
	, DATE_FORMAT(CURDATE(), '%Y-%M-%D %h:%m:%s') b_1
FROM DUAL
  • 결과
"22-07-01 at 12:00:00 AM" "22-07-01 12:07:00" "2022-July-1st 12:00:00 AM" "2022-July-1st 12:07:00"

MONTHNAME(), DAYNAME(),DAYOFMONTH()

입력된날짜의 요일이름, 월이름 날짜를 구할 수있다.

 

  • 실행
SELECT DAYNAME(NOW()) DN
	  , MONTHNAME(NOW()) MN
	  , DAYOFMONTH(NOW()) DM
  FROM dual
  • 결과
"Friday" "July" "1"

 

이상 아주 간단하게 mariaDB에서 사용되는 날짜관련 함수에 대해 알아보았다. 

쿼리를 조금이라도 만졌던 사람이라면 간단하게 알수있는 내용이지만 갑작스럽게 생각 안나는 순간들이 있으니 그때를 대비하여 기록한다.