컴퓨터/MySQL

MySQL (14) - 내장함수를 이용하여 날짜 및 시간을 다뤄보자

달서비 2023. 6. 20. 20:44

이전에 게시글에 문자와 숫자 함수를 이용하여 쿼리를 다뤘었습니다. 문득숫자, 문자 만큼 DBMS에서 내장함수를 많이 사용한다는 것을 깨달았습니다. 그래서 날짜 및 시간을 다루는 내장함수를 소개하겠습니다.

 

날짜 및 시간 함수 정리

CURDATE, CURTIME, NOW, SYSDATE

SELECT CURDATE() -- 2023-06-19
     , CURTIME() -- 10:30:45
     , NOW()     -- 2023-06-19 10:30:45
     , SYSDATE() -- 2023-06-19 10:30:45
FROM DUAL;

가장 먼저 소개할 함수는 현재의 날짜와 시간을 알아내는 함수입니다.

CURDATE함수는 현재의 년-월-일을 출력하고 CURTIME은 현재의 시:분:초를 출력합니다. NOW와 SYSDATE함수는 년-월-일 시:분:초를 출력합니다.

 

YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MICROSECOND 

SELECT YEAR(SYSDATE())  -- 2023
     , MONTH(SYSDATE()) -- 6
     , DAY(SYSDATE())   -- 19
     , HOUR(SYSDATE())  -- 10
     , MINUTE(SYSDATE()) -- 30
     , SECOND(SYSDATE()) -- 45
     , MICROSECOND(SYSDATE()) --100000
FORM DUAL;

DATE 형식의 값을 받으면 필요한 날짜 시간 데이터를 뽑는 함수들입니다. SYSDATE 함수로 받은 현재의 날짜와 시간을  위에서부터 년, 월, 일, 시, 분, 초, 마이크로초로 반환합니다. 

 

DATE, TIME

SELECT DATE(SYSDATE()) -- 2023-06-19
     , TIME(SYSDATE()) -- 10:30:45
FORM DUAL;

DATE와 TIME함수는 각각 '년-월-일', '시:분:초'로 반환하는 함수입니다. 위의 예제는 현재 시각을 날짜와 시간으로 바꾸었습니다.

 

LAST_DAY

SELECT LAST_DAY('2023-06-19') -- 2023-06-30
     , LAST_DAY('2024-02-28') -- 2024-02-29
FROM DUAL;

LASY_DAY 함수는 해당 월의 마지막 날을 출력하는 함수입니다. 위의 예제는 2023년 6월의 마지막 날은 '2023-06-30'입니다. 추가로 윤년이 있는 2월은 2월 29일로 출력합니다.

 

TIME_TO_SEC

SELECT TIME_TO_SEC('10:30:45') -- 37845
FROM DUAL;

TIME_TO_SEC 함수는 시간을 초 단위로 구합니다. 위에서는 10*60*60 + 30*60 + 45의 값인 '37845'가 출력됩니다.

 

DATEDIFF, TIMEDIFF, TIMESTAMPDIFF

SELECT DATEDIFF('2023-06-19', '2023-06-07') -- 12
     , TIMEDIFF('22:30:00', '14:30:00') -- 08:00:00
     , TIMESTAMPDIFF(HOUR, '2023-06-19 22:30:00', '2023-06-07 14:30:00') -- -280
FROM DUAL;

세 함수는 날짜와 시간을 비교하는 함수입니다. 먼저 DATEDIFF 함수는 두 날짜를 비교하는 함수입니다. 왼쪽부터 날짜1 - 날짜2의 값을 나옵니다. 두 번째로 TIMEDIFF 함수는 두 시간을 비교합니다. 시간1 - 시간2의 값을 호출합니다. 마지막으로 TIMESTAMPDIFF 함수는 날짜:시간2 - 날짜:시간1의 값을 HOUR로 호출합니다. HOUR이 아니라 다른 시간 단위로도 호 할 수 있습니다.

 

ADDDATE, SUBDATE, ADDTIME, SUBTIME

SELECT ADDDATE('2023-06-19', INTERVAL 31 DAY) -- 2023-07-20
     , SUBDATE('2023-06-19', INTERVAL 31 DAY) -- 2023-05-19
     , ADDTIME('2023-06-19 22:30:45', '1:0:0') -- 2023-06-19 23:30:45
     , SUBTIME('2023-06-19 22:30:45', '1:0:0') -- 2023-06-19 21:30:45
FROM DUAL;

먼저 ADDDATE, SUBDATE 함수는 날짜를 더하거나 는 함수입니다. ADDTIME, SUBTIME 함수는 시간을 더하거나 빼는 함수입니다. 예제는 31일을 더하거나 빼는 예제와 1시간을 더하거나 빼는 예제입니다. 이를통해 다음과 같은 결과가 나왔습니다.

 

DAYOFWEEK, MONTHNAME, DAYOFYEAR

SELECT DAYOFWEEK(SYSDATE()) -- 2
     , MONTHNAME(SYSDATE()) -- June
     , DAYOFYEAR(SYSDATE()) -- 170
FROM DUAL;

-- SYSDATE() 
-- 2023-06-19 10:30:45

DAYOFWEEK 함수는 요일을 숫자로 출력합니다. 숫자는 다음과 같습니다.

1 2 3 4 5 6 7

MONTHNAME 함수는 대상이 되는 달의 영어를 출력합니다. 기준일자는 6월이므로 June을 출력합니다.

DAYOFYEAR 함수는 1년 중 지금 며이 지났는지 출력합니다.