MySQL의 날짜 관련 데이터 타입

데이터 타입 설명 예시
DATE 연-월-일 형식의 날짜 정보를 가지는 데이터타입 2024-01-01
TIME HH:MM:SS 형식의 시간 정보를 가지는 데이터타입 12:00:35
DATETIME 날짜와 시간 정보를 모두 가지는 데이터타입.
1000-01-01 00:00:00부터 9999-12-31 23:59:59까지
1875-02-05 12:00:00
TIMESTAMP 날짜와 시간 정보를 모두 가지는 데이터타입
UTC 시간대에 대한 정보를 가지며 시간대 변환이 가능하다.
‘1970-01-01 00:00:01’부터 ‘2038-01-19 03:14:07’까지
2024-01-01 12:00:35
YEAR 연도 정보를 가지는 데이터타입 2024

현재 날짜 및 시간 출력

함수 설명 input type output type
NOW() 쿼리를 실행하는 순간의 날짜와 시간을 반환 None DATETIME
SYSDATE() 함수(자신)가 호출되는 순간의 날짜와 시간을 반환 None DATETIME
CURRENT_TIMESTAMP() 쿼리를 실행하는 순간의 날짜와 시간을 반환 None TIMESTAMP
CURDATE() 쿼리를 실행하는 순간의 날짜를 반환 None DATE
CURTIME() 쿼리를 실행하는 순간의 시간을 반환 None TIME

NOW()

쿼리를 실행하는 순간의 날짜와 시간을 반환합니다. 반환 타입은 DATETIME 입니다.

1
2
SELECT NOW();
-- >>> 2024-02-05 13:00:13.000

SYSDATE()

함수(자신)가 호출되는 순간의 날짜와 시간을 반환합니다. 반환 타입은 DATETIME 입니다.

1
2
SELECT SYSDATE()
-- >>> 2024-02-05 13:02:43.000

CURRENT_TIMESTAMP()

쿼리를 실행하는 순간의 날짜와 시간을 반환합니다.
NOW()와 비슷하지만 반환 타입이 TIMESTAMP 형식으로 다릅니다.

1
2
SELECT CURRENT_TIMESTAMP()
-- >>> 2024-02-19 12:28:34

CURDATE()

쿼리를 실행하는 순간의 날짜를 반환합니다. DATE 형식을 반환합니다.

1
2
SELECT CURDATE()
-- >>> 2024-02-05

CURTIME()

쿼리를 실행하는 순간의 시간을 출력합니다. TIME 형식을 반환합니다.

1
2
SELECT CURTIME()
-- >>> 13:02:14

NOW와 SYSDATE 의 차이

NOW는 쿼리를 실행한 순간, 그리고 SYSDATE 쿼리가 실행되면서 SYSDATE 함수가 호출된 순간을 반환합니다. 쉽게 말하면 NOW는 쿼리 자체가 실행된 순간, SYSDATE는 자기 자신이 실행된 순간을 반환하는 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT NOW(), SLEEP(5), NOW();
-- >> +---------------------+----------+---------------------+
-- >> | SYSDATE()           | SLEEP(2) | SYSDATE()           |
-- >> +---------------------+----------+---------------------+
-- >> | 2024-02-05 13:11:45 |        0 | 2024-02-05 13:11:45 |
-- >> +---------------------+----------+---------------------+

SELECT SYSDATE(), SLEEP(5), SYSDATE();
-- >> +---------------------+----------+---------------------+
-- >> | SYSDATE()           | SLEEP(5) | SYSDATE()           |
-- >> +---------------------+----------+---------------------+
-- >> | 2024-02-05 13:21:10 |        0 | 2024-02-05 13:21:15 |
-- >> +---------------------+----------+---------------------+

날짜와 관련된 다른 함수들을 보면 대부분 “쿼리를 실행한” 순간의 날짜나 시간을 반환합니다.

1
2
3
4
5
6
SELECT CURTIME(), SLEEP(5), CURTIME();
-- >> +-----------+----------+-----------+
-- >> | CURTIME() | SLEEP(5) | CURTIME() |
-- >> +-----------+----------+-----------+
-- >> | 13:49:45  |        0 | 13:49:45  |
-- >> +-----------+----------+-----------+

연, 월, 일, 요일

함수 설명 output type
YEAR(날짜) 날짜의 연도를 반환 INT
MONTH(날짜) 날짜의 월을 반환 INT
DAY(날짜) 날짜의 일을 반환 INT
DAYOFMONTH(날짜) 날짜가 해당 월의 몇 번째 일인지 반환 INT
DAYOFYEAR(날짜) 날짜가 해당 연도의 몇 번재 일인지 반환 INT
WEEKDAY(날짜) 날짜가 해당 주의 몇 번째 일인지 반환
0: 월요일 / 1: 화요일 .. / 6: 일요일
INT
DAYOFWEEK(날짜) 날짜가 해당 주의 몇 번째 일인지 반환
1: 일요일 / 2: 월요일 … / 7: 토요일
INT
MONTHNAME(날짜) 날짜의 월을 영문명으로 반환 CHAR(9)
WEEK(날짜) 날짜가 속한 주가 해당 연도의 몇 번째 주인지 반환 INT

YEAR(), MONTH(), DAY()

날짜의 연, 월, 일을 반환합니다.

1
2
3
4
5
6
7
8
SELECT NOW();
-- >> '2024-02-07'
SELECT YEAR(NOW());
-- >> 2024
SELECT MONTH(NOW());
-- >> 2
SELECT DAY('2024-02-07');
-- >> 7

DAYOF()

날짜가 해당 연도 혹은 월, 주의 몇 번째 일인지를 반환합니다.

1
2
3
4
5
6
7
8
9
10
SELECT NOW();
-- >> '2024-02-07'
SELECT DAYOFMONTH(NOW());
-- >> 7
SELECT DAYOFYEAR(NOW());
-- >> 38
SELECT DAYOFWEEK(NOW()); -- 일요일부터 1로 카운팅
-- >> 4
SELECT WEEKDAY(NOW());   -- 월요일부터 0으로 카운팅
-- >> 2

WEEK()

날짜가 속한 주가 해당 연도의 몇 번째 주인지 반환합니다.

1
2
3
4
SELECT NOW();
-- >> '2024-02-07'
SELECT WEEK(NOW());
-- >> 5

MONTHNAME()

날짜의 월을 영문명으로 반환합니다.

1
2
3
4
SELECT NOW();
-- >> '2024-02-07'
SELECT MONTHNAME(NOW());
-- >> February

DAYOFWEEK와 WEEKDAY 차이

둘 모두 대상 날짜가 해당 주의 몇 번째 날인지를 반환하는 함수입니다. 다른 점은 DAYOFWEEK 는 일요일을 1로 시작하여 카운팅을 하고, WEEKDAY는 월요일을 0으로 시작하여 카운팅을 한다는 점입니다.

1
2
3
4
5
6
7
8
9
-- 2024-02-07 기준 : 수요일

SELECT DAYOFWEEK(NOW());
-- >> 4
-- 일(1), 월(2), 화(3), 수(4)

SELECT WEEKDAY(NOW());
-- >> 2
-- 월(0), 화(1), 수(2)

DATE FORMAT

DATE_FORMAT(날짜, ‘형식’)

날짜를 형식에 맞게 반환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT NOW();
-- >> 2024-02-07 12:58:50

SELECT DATE_FORMAT(NOW(), '%Y-%m-%d');
-- >> 2024-02-07
SELECT DATE_FORMAT(NOW(), '%Y-%m');
-- >> 2024-02
SELECT DATE_FORMAT(NOW(), '%d');
-- >> 07
SELECT DATE_FORMAT(NOW(), '%D');
-- >> 7th
SELECT DATE_FORMAT(NOW(), '');
SELECT DATE_FORMAT(NOW(), '');
SELECT DATE_FORMAT(NOW(), '');
형식 설명 비고 예시
%Y 연도 네자리(nnnn)로 표현 2024
%y 연도 두자리(nn)로 표현 24
%m 두자리(nn)로 표현 02
%c 한자리(n) 혹은 두자리(nn)로 표현 2
%M 영문으로 표현 February
%b 영문 약어로 표현 Feb
%d 두자리(nn)로 표현 07
%e 한자리(n) 혹은 두자리(nn)로 표현 7
%D 영문 순서(1st, 2nd …)로 표현 7th
%a 요일 영문 요일로 표현 (약어) Wed
%W 요일 영문 요일로 표현 (full) Wednesday
%w 요일 숫자 요일료 표현 (월요일부터 1) 3
%T 시:분:초 24시간 셈법으로 hh:mm:ss 18:44:55
%r 시:분:초 AM/PM 12시간 셈법으로 hh:mm:ss AM/PM 06:44:55 PM
%p AM/PM AM/PM PM
%H 시간 24시간 셈법으로 (ex. 23) 두자리(nn) 18
%h 시간 12시간 셈법으로 (ex. 11) 두자리(nn) 06
%k 시간 24시간 셈법으로 한자리(n) ~ 두자리(nn) 18
%l 시간 12시간 셈법으로 한자리(n) ~ 두자리(nn) 6
%i 두자리(nn)로 표현 05
%S 두자리(nn)로 표현 02
%s 두자리(nn)로 표현 (뭐가 다른거지?) 02
%f 마이크로초 6자리 013451
%j 연도로부터의 일수 세자리(nnn)로 표현 038
%U 연도로부터의 주수 두자리(nn)로 표현. 주 시작은 월요일, 1부터 05
%u 연도로부터의 주수 두자리(nn)로 표현. 주 시작은 일요일, 0부터 06
%V 연도로부터의 주수 두자리(nn)로 표현. ISO8601표준에 따름. 월요일부터 05
%v 연도로부터의 주수 두자리(nn)로 표현. %V와 같은데 일요일부터 06

날짜 연산

함수 설명 output_type
DATEDIFF(‘일자1’, ‘일자2’) 두 날짜 사이의 일수 차이를 계산 INT
DATE_ADD(‘날짜1’, INTERVAL 숫자 단위)
DATE_ADD(‘timestamp1’, INTERVAL 숫자 단위)
날짜나 시간을 더함 단위에 따라서 다름
DATE_SUB(‘날짜1’, INTERVAL 숫자 단위)
DATE_SUB(‘timestamp1’, INTERVAL 숫자 단위)
날짜나 시간을 뺌
DATE_ADD와 사용법 동일.
단위에 따라서 다름
FROM_DAYS() 일수를 DATETIME 형식으로 변환 DATETIME
TO_DAYS() DATETIME 형식을 일수로 변환 INT
TIMESTAMPDIFF(단위, ‘timestamp1’, ‘timestamp2’) 두 시간의 차이를 계산.
단위 : Second, Minute, Day, Month, Year
단위에 따라서 다름

DATADIFF()

DATEDIFF 는 두 날짜 사이의 일수 차이를 계산합니다. 함수의 파라미터로 들어가는 순서대로 DATEDIFF(a, b) 면 a - b 의 일수를 구합니다.

1
2
3
4
5
SELECT DATEDIFF('2024-02-10', '2024-02-11');
-- >> -1

SELECT DATEDIFF('2024-02-20', '2024-02-10');
-- >> 10

일수 기준으로 계산을 하므로, DATETIME으로 2초가 차이나는 다음과 같은 경우에도 1일 차이로 값을 반환합니다.

1
2
SELECT DATEDIFF('2024-02-11 00:00:01', '2024-02-10 23:59:59');
-- >> 1

DATE_ADD(), DATE_SUB()

DATE_ADD : 지정 DATE 혹은 TIMESTAMP 에 대해 며칠, 몇개월, 몇년, 몇시간, 몇분, 몇초 후의 DATE 혹은 TIMESTAMP를 반환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
SELECT DATE_ADD('2024-01-01', INTERVAL 3 DAY);
-- >> 2024-01-04
SELECT DATE_ADD('2024-01-01', INTERVAL 3 MONTH);
-- >> 2024-04-01
SELECT DATE_ADD('2024-01-01', INTERVAL 3 YEAR);
-- >> 2027-01-01
SELECT DATE_ADD('2024-01-01', INTERVAL 3 HOUR);
-- >> 2024-01-01 03:00:00
SELECT DATE_ADD('2024-01-01', INTERVAL 3 MINUTE);
-- >> 2024-01-01 00:03:00
SELECT DATE_ADD('2024-01-01', INTERVAL 3 SECOND);
-- >> 2024-01-01 00:00:03
1
2
3
4
SELECT DATE_ADD('2024-01-01 12:00:00', INTERVAL 3 SECOND);
-- >> 2024-01-01 12:00:03
SELECT DATE_ADD('2024-01-01 12:00:00', INTERVAL 3 DAY);
-- >> 2024-01-04 12:00:00

DATE_SUB : 지정 DATE 혹은 TIMESTAMP 에 대해 며칠, 몇개월, 몇년, 몇시간, 몇분, 몇초 전의 DATE 혹은 TIMESTAMP를 반환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
SELECT DATE_SUB('2024-01-01', INTERVAL 3 DAY);
-- >> 2023-12-29
SELECT DATE_SUB('2024-01-01', INTERVAL 3 MONTH);
-- >> 2023-10-01
SELECT DATE_SUB('2024-01-01', INTERVAL 3 YEAR);
-- >> 2021-01-01
SELECT DATE_SUB('2024-01-01', INTERVAL 3 HOUR);
-- >> 2023-12-31 21:00:00
SELECT DATE_SUB('2024-01-01', INTERVAL 3 MINUTE);
-- >> 2023-12-31 23:57:00
SELECT DATE_SUB('2024-01-01', INTERVAL 3 SECOND);
-- >> 2023-12-31 23:59:57
1
2
3
4
SELECT DATE_SUB('2024-01-01 12:00:00', INTERVAL 3 SECOND);
-- >> 2024-01-01 11:59:57
SELECT DATE_SUB('2024-01-01 12:00:00', INTERVAL 3 DAY);
-- >> 2023-12-29 12:00:00

FROM_DAYS(), TO_DAYS()

FROM_DAYS 는 일수를 DATETIME 형식으로 바꿔줍니다. 그레고리안 캘린더를 따르며
365일까지 0년 0월 0일로 표기하고, 365.5일 부터 1년 1월 1일로 표시합니다.

1
2
3
4
5
6
7
8
9
10
SELECT FROM_DAYS(2024*365);
-- >> 2022-08-28
SELECT FROM_DAYS(2024*365.2425); -- 그레고리안력
-- >> 2024-01-01
SELECT FROM_DAYS(1);
-- >> 0000-00-00
SELECT FROM_DAYS(365);
-- >> 0000-00-00
SELECT FROM_DAYS(365.5);
-- >> 0001-01-01

TO_DAYS 는 0년부터 주어진 DATETIME 까지의 기간을 일수로 반환합니다. FROM_DAYS와 동일하게 그레고리안 캘린더를 따릅니다.

1
2
3
4
5
6
SELECT TO_DAYS('2024-01-01');
-- >> 739251
SELECT TO_DAYS('0001-01-01');
-- >> 366
SELECT TO_DAYS('0001-02-01');
-- >> 32

TIMESTAMPDIFF

두 TIMESTAMP 간의 차이를 지정한 단위를 적용하여 반환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
SELECT TIMESTAMPDIFF(YEAR, '2019-01-01 10:59:20', '2024-01-01 11:00:00');
-- >> 5
SELECT TIMESTAMPDIFF(MONTH, '2019-01-01 10:59:20', '2024-01-01 11:00:00');
-- >> 60
SELECT TIMESTAMPDIFF(DAY, '2019-01-01 10:59:20', '2024-01-01 11:00:00');
-- >> 1826
SELECT TIMESTAMPDIFF(HOUR, '2024-01-01 10:59:00', '2024-01-01 12:00:00');
-- >> 1
SELECT TIMESTAMPDIFF(MINUTE, '2024-01-01 11:59:00', '2024-01-01 12:00:00');
-- >> 1
SELECT TIMESTAMPDIFF(SECOND, '2024-01-01 11:59:00', '2024-01-01 12:00:00');
-- >> 60
1
2
3
4
5
SELECT TIMESTAMPDIFF(MINUTE, '2024-01-01 11:59:00', '2024-01-01 12:00:00');
-- >> 1
SELECT TIMESTAMPDIFF(MINUTE, '2024-01-01 11:59:20', '2024-01-01 12:00:00');
-- >> 0
-- 40초 차이가 있지만 분으로는 0분

Reference

mysql 날짜 연산 함수 : https://inpa.tistory.com
mysql 날짜 연산 함수 : https://dadev.tistory.com
mysql 날짜 연산 함수 : https://jaehoney.tistory.com/53
sysdate와 now의 차이 : https://thenicesj.tistory.com/68
sysdate와 now의 차이 : https://velog.io/@kimju0913
date format : https://lightblog.tistory.com/155
FROM_DAYS : https://www.w3schools.com
TO_DAYS : https://www.w3schools.com
TIMESTAMP와 DATETIME의 차이 : https://jaejade.tistory.com/125
날짜, 시간 데이터타입 : https://unabated.tistory.com