MySQL 현재 시간 가이드: NOW(), CURRENT_TIMESTAMP, DATE_FORMAT, 시간대 설정 및 모범 사례

目次

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은 현재 시간을 조회할 수 있는 여러 함수를 제공합니다. 차이를 이해하고 상황에 맞게 사용하세요.

FunctionReturnsExample
NOW()Current date and time (date + time)SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMPSame as NOW() (SQL standard)SELECT CURRENT_TIMESTAMP;
CURDATE()Current date onlySELECT CURDATE();2025-02-11
CURTIME()Current time onlySELECT CURTIME();16:00:00

NOW() Function

NOW()는 MySQL에서 현재 시간을 조회할 때 가장 많이 사용되는 함수입니다.
날짜와 시간을 모두 반환합니다.

SELECT NOW();

출력 예시:

2025-02-11 16:00:00
  • NOW()는 현재 시스템 시간을 반환합니다.
  • 시간대의 영향을 받기 때문에, 환경에 따라 표시되는 시간이 달라질 수 있습니다(“시간대 설정” 섹션에서 자세히 설명).

How to Use CURRENT_TIMESTAMP

CURRENT_TIMESTAMPNOW()와 거의 동일하게 동작합니다. 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?

PurposeRecommended Function
Retrieve both date and timeNOW() or CURRENT_TIMESTAMP
Retrieve date onlyCURDATE()
Retrieve time onlyCURTIME()

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

SpecifierMeaningExample (2025-02-11 16:45:30)
%Y4-digit year2025
%m2-digit month (01-12)02
%d2-digit day (01-31)11
%HHour (00-23, 24-hour format)16
%iMinutes (00-59)45
%sSeconds (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()

특정 부분만 추출하고 싶을 때는 다음 함수를 사용합니다.

FunctionReturnsSQLOutput Example (2025-02-11 16:45:30)
YEAR()YearSELECT YEAR(NOW());2025
MONTH()MonthSELECT MONTH(NOW());2
DAY()DaySELECT 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
UnitMeaningExample
SECONDSecondsNOW() + INTERVAL 10 SECOND
MINUTEMinutesNOW() + INTERVAL 5 MINUTE
HOURHoursNOW() + INTERVAL 2 HOUR
DAYDaysNOW() + INTERVAL 10 DAY
MONTHMonthsNOW() + 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
);

DATETIMETIMESTAMP의 차이

TypeAffected by Time ZoneCan Set CURRENT_TIMESTAMP as Default
TIMESTAMPYesYes
DATETIMENoNo

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 CaseRecommended
Retrieve the current time in a SELECT statementNOW()
Automatically set the current time during INSERTCURRENT_TIMESTAMP
Set as the default value of a TIMESTAMP columnCURRENT_TIMESTAMP

TIMESTAMPDATETIME을 언제 사용할지

Data TypeAffected by Time ZoneStorage Size
TIMESTAMPYes4 bytes
DATETIMENo8 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;