1. Introduction
MySQL에서 현재 시간을 다루어야 할 때는 언제인가?
MySQL에서 현재 시간을 가져오는 것은 다양한 상황에서 필요합니다. 예를 들어, 다음과 같은 사용 사례가 흔합니다:
- 데이터를 등록할 때 자동으로 타임스탬프 삽입
- 주문 데이터나 로그 데이터를 저장할 때 생성 일시를 기록하는 경우.
- 현재 시간을 기준으로 데이터 필터링
- 예를 들어, 최근 7일 이내의 데이터만 조회하거나 미래 날짜가 있는 레코드를 검색하는 경우.
- 표시용 날짜·시간 포맷팅
- 보고서를 생성할 때 가독성을 높이기 위해 날짜·시간 값을 포맷팅하는 경우.
- 현재 시간을 이용한 데이터 만료 관리
- 예를 들어, 쿠폰이 현재 시간과 비교해 아직 유효한지 판단하는 경우.
보시다시피, MySQL에서 현재 시간을 올바르게 조회하고 조작하는 능력은 데이터베이스 관리에 있어 중요한 스킬입니다.
이 글에서 배우게 될 내용
이 글에서는 다음 주제를 자세히 다룹니다:
- MySQL에서 현재 시간을 조회하는 방법 (
NOW(),CURRENT_TIMESTAMP등) - 날짜·시간 포맷을 변경하는 방법 (
DATE_FORMAT()사용) - 현재 시간을 이용한 날짜·시간 계산 (
INTERVAL사용) - 시간대 변경 방법 (
SET SESSION time_zone) - 현재 시간을 기본값으로 사용하는 방법 (
CURRENT_TIMESTAMP) - 자주 발생하는 오류와 해결 방법 (FAQ)
MySQL에서 “현재 시간”을 다루는 기본부터 고급 사용법까지, 실용적인 SQL 예제와 함께 안내합니다. 끝까지 꼭 읽어보세요.
2. How to Retrieve the Current Time in MySQL
List of Functions to Retrieve the Current Time in MySQL
MySQL은 현재 시간을 조회할 수 있는 여러 함수를 제공합니다. 차이를 이해하고 상황에 맞게 사용하세요.
| Function | Returns | Example |
|---|---|---|
NOW() | Current date and time (date + time) | SELECT NOW(); → 2025-02-11 16:00:00 |
CURRENT_TIMESTAMP | Same as NOW() (SQL standard) | SELECT CURRENT_TIMESTAMP; |
CURDATE() | Current date only | SELECT CURDATE(); → 2025-02-11 |
CURTIME() | Current time only | SELECT CURTIME(); → 16:00:00 |
NOW() Function
NOW()는 MySQL에서 현재 시간을 조회할 때 가장 많이 사용되는 함수입니다.
날짜와 시간을 모두 반환합니다.
SELECT NOW();
출력 예시:
2025-02-11 16:00:00
NOW()는 현재 시스템 시간을 반환합니다.- 시간대의 영향을 받기 때문에, 환경에 따라 표시되는 시간이 달라질 수 있습니다(“시간대 설정” 섹션에서 자세히 설명).
How to Use CURRENT_TIMESTAMP
CURRENT_TIMESTAMP는 NOW()와 거의 동일하게 동작합니다. SQL 표준을 따르며 다른 데이터베이스에서도 사용할 수 있습니다.
SELECT CURRENT_TIMESTAMP;
출력 예시:
2025-02-11 16:00:00
Get Only the Date with CURDATE()
CURDATE()는 현재 날짜(년·월·일)만 조회하고 싶을 때 사용합니다.
SELECT CURDATE();
출력 예시:
2025-02-11
Get Only the Time with CURTIME()
현재 시간(시·분·초)만 조회하고 싶다면 CURTIME()을 사용합니다.
SELECT CURTIME();
출력 예시:
16:00:00
Which Function Should You Use?
| Purpose | Recommended Function |
|---|---|
| Retrieve both date and time | NOW() or CURRENT_TIMESTAMP |
| Retrieve date only | CURDATE() |
| Retrieve time only | CURTIME() |
3. How to Format the Current Time in MySQL
Custom Formatting with DATE_FORMAT()
Basic Syntax of DATE_FORMAT()
MySQL에서는 DATE_FORMAT() 함수를 이용해 날짜와 시간의 포맷을 자유롭게 변경할 수 있습니다.
SELECT DATE_FORMAT(datetime_value, 'format_specifiers');
예시: NOW()를 YYYY/MM/DD HH:MM 형식으로 변환
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');
출력:
2025/02/11 16:45
List of Common Format Specifiers
| Specifier | Meaning | Example (2025-02-11 16:45:30) |
|---|---|---|
%Y | 4-digit year | 2025 |
%m | 2-digit month (01-12) | 02 |
%d | 2-digit day (01-31) | 11 |
%H | Hour (00-23, 24-hour format) | 16 |
%i | Minutes (00-59) | 45 |
%s | Seconds (00-59) | 30 |
Extract Only the Time Part with TIME()
NOW()가 반환하는 datetime에서 시간 부분만 추출하려면 TIME() 함수를 사용합니다.
SELECT TIME(NOW());
출력:
16:45:30
Extract Parts with YEAR(), MONTH(), and DAY()
특정 부분만 추출하고 싶을 때는 다음 함수를 사용합니다.
| Function | Returns | SQL | Output Example (2025-02-11 16:45:30) |
|---|---|---|---|
YEAR() | Year | SELECT YEAR(NOW()); | 2025 |
MONTH() | Month | SELECT MONTH(NOW()); | 2 |
DAY() | Day | SELECT DAY(NOW()); | 11 |
Practical Examples of Formatting
다음 SQL은 실무에서 다양한 형식을 시도할 때 유용합니다.
SELECT
NOW() AS 'Original datetime',
DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
DATE_FORMAT(NOW(), '%H:%i:%s') AS 'HH:MM:SS',
TIME(NOW()) AS 'Time only',
YEAR(NOW()) AS 'Year',
MONTH(NOW()) AS 'Month',
DAY(NOW()) AS 'Day';

4. MySQL에서 현재 시간을 사용한 날짜/시간 계산
INTERVAL을 사용한 더하기/빼기
기본 구문
SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;
NOW()를 기반으로 시간 추가
예를 들어, “일주일 후” 날짜시간을 가져오려면:
SELECT NOW() + INTERVAL 7 DAY;
출력 예시:
2025-02-18 16:30:00
| Unit | Meaning | Example |
|---|---|---|
| SECOND | Seconds | NOW() + INTERVAL 10 SECOND |
| MINUTE | Minutes | NOW() + INTERVAL 5 MINUTE |
| HOUR | Hours | NOW() + INTERVAL 2 HOUR |
| DAY | Days | NOW() + INTERVAL 10 DAY |
| MONTH | Months | NOW() + INTERVAL 3 MONTH |
DATEDIFF()를 사용하여 두 날짜 사이 차이 계산
SELECT DATEDIFF(NOW(), '2025-01-01');
출력 예시:
30
BETWEEN을 사용한 날짜 범위 필터링
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
5. MySQL 시간대 설정
현재 시간대 확인
SHOW VARIABLES LIKE '%time_zone%';
출력 예시:
+------------------+----------------+
| Variable_name | Value |
+------------------+----------------+
| system_time_zone | UTC |
| time_zone | SYSTEM |
+------------------+----------------+
세션별 시간대 변경
SET SESSION time_zone = 'Asia/Tokyo';
서버 기본 시간대 변경
다음 내용을 설정 파일(my.cnf)에 추가합니다:
[mysqld]
default_time_zone = 'Asia/Tokyo'
UTC_TIMESTAMP로 UTC 시간 가져오기
SELECT UTC_TIMESTAMP();
CONVERT_TZ()를 사용해 로컬 시간으로 변환
SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');
6. MySQL에서 현재 시간을 기본값으로 설정하는 방법
CURRENT_TIMESTAMP를 기본값으로 설정
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
ON UPDATE CURRENT_TIMESTAMP를 사용한 자동 업데이트
CREATE TABLE logs (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
DATETIME과 TIMESTAMP의 차이
| Type | Affected by Time Zone | Can Set CURRENT_TIMESTAMP as Default |
|---|---|---|
TIMESTAMP | Yes | Yes |
DATETIME | No | No |
NOW()를 기본값으로 사용할 수 없는 이유와 해결책
ERROR 1067 (42000): Invalid default value for 'created_at'
해결책:
CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
7. 일반적인 MySQL 오류와 해결책 (FAQ)
NOW()를 기본값으로 사용할 수 없음
오류 예시
CREATE TABLE logs (
created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'
해결책
CREATE TABLE logs (
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CURRENT_TIMESTAMP 시간이 올바르지 않음
SHOW VARIABLES LIKE 'time_zone';
해결책
SET SESSION time_zone = 'Asia/Tokyo';
NOW() 결과가 1시간 차이남
SHOW VARIABLES LIKE 'system_time_zone';
해결책
SET GLOBAL time_zone = 'Asia/Tokyo';
BETWEEN 범위 필터링이 예상대로 작동하지 않음
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';
해결책
SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';
8. MySQL에서 현재 시간을 다루는 모범 사례
NOW()와 CURRENT_TIMESTAMP를 언제 사용할지
| Use Case | Recommended |
|---|---|
Retrieve the current time in a SELECT statement | NOW() |
Automatically set the current time during INSERT | CURRENT_TIMESTAMP |
Set as the default value of a TIMESTAMP column | CURRENT_TIMESTAMP |
TIMESTAMP와 DATETIME을 언제 사용할지
| Data Type | Affected by Time Zone | Storage Size |
|---|---|---|
TIMESTAMP | Yes | 4 bytes |
DATETIME | No | 8 bytes |
UTC로 저장하고 로컬 시간으로 변환
SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');
Use >= and < Instead of BETWEEN
SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00'
AND created_at < '2025-03-01 00:00:00';
Standardize the Usage of INTERVAL
SELECT NOW() + INTERVAL 1 DAY;
Properly Clean Up Old Data
DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;


