MySQL에서 날짜를 실시간으로 업데이트해야 하는 경우, 가장 많이 사용되는 함수가 바로 NOW()이다.
NOW()는 쿼리가 실행된 현재 시각(YYYY-MM-DD HH:MM:SS)을 반환하는 내장 함수로,
주로 UPDATE 문에서 수정일 갱신, 상태 변경 기록, 로그인 시간 업데이트 등에 사용된다.

✅ NOW() 함수란?
SELECT NOW();
-- 결과 예시: 2025-06-26 10:23:45
NOW()는 서버의 현재 시간(타임존 기준)을 반환하며, DATETIME 또는 TIMESTAMP 컬럼과 함께 사용할 수 있다.
데이터 변경 시점을 자동으로 기록할 수 있어, 트랜잭션이나 로그 처리에 필수적이다.
✅ UPDATE + NOW() 기본 문법
UPDATE 테이블명
SET 날짜컬럼 = NOW()
WHERE 조건;
예제: 사용자 마지막 로그인 시간 갱신
UPDATE users
SET last_login = NOW()
WHERE id = 1001;
사용자 ID가 1001번인 사람의 last_login 필드를 현재 시각으로 갱신하는 간단한 예제이다.
✅ 조건부 날짜 갱신 예제
UPDATE orders
SET status = '배송완료',
delivered_at = NOW()
WHERE status = '배송중' AND delivery_date <= CURDATE();
배송 예정일이 지난 배송중 상태의 주문을 완료로 변경하고, 배송 완료 시간을 기록한다.
NOW()와 CURDATE()를 조합하면 날짜 비교와 기록을 동시에 처리할 수 있다.
✅ NOW()와 함께 사용하는 날짜 관련 함수들
| 함수명 | 설명 |
| NOW() | 현재 시각 반환 (날짜 + 시간) |
| CURDATE() | 오늘 날짜 반환 (시간 제외) |
| CURRENT_TIMESTAMP | NOW()와 동일한 결과 |
| DATE_ADD() | 날짜에 시간/일 추가 |
| DATE_SUB() | 날짜에서 시간/일 차감 |
| TIMESTAMPDIFF() | 날짜 간의 차이를 구함 |
이 함수들을 조합하면 날짜 관련 로직을 매우 유연하게 구성할 수 있다.
✅ 예제: 연장 기간 자동 갱신
UPDATE subscriptions
SET expire_date = DATE_ADD(expire_date, INTERVAL 30 DAY),
updated_at = NOW()
WHERE id = 42;
구독 기간을 30일 연장하고 수정 시각을 기록하는 예제이다.
기간 조정과 타임스탬프 갱신을 동시에 처리할 수 있는 실무 활용 케이스이다.
✅ 로그인 상태에 따른 조건 처리
UPDATE users
SET login_count = login_count + 1,
last_login_at = NOW()
WHERE email = 'test@example.com';
로그인 횟수를 증가시키고 로그인 시간을 최신화하는 로직이다.
로그인 처리 시 가장 일반적으로 사용되는 쿼리 구조이다.
✅ 자동 수정 일자 필드 관리 팁
MySQL 테이블을 설계할 때, 다음과 같이 updated_at 컬럼을 자동 갱신되도록 설정하면 관리가 매우 편리하다.
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
하지만 이 방식은 UPDATE문에 컬럼이 포함되지 않아도 수정 시각이 자동으로 변경되므로,
정확한 제어가 필요할 때는 직접 SET updated_at = NOW()를 사용하는 방식이 더 안전하다.
✅ 주의할 점
- NOW()는 쿼리가 실행된 정확한 시각을 기준으로 하므로, 타임존 설정에 따라 결과가 달라질 수 있다
- DEFAULT NOW()는 DATETIME과 TIMESTAMP 컬럼에만 적용 가능하다
- 여러 컬럼을 동시에 수정할 때, NOW()는 모든 시간 필드에 동일하게 적용됨을 명심해야 한다
✅ 실전 예제 모음
포인트 만료일 일괄 갱신
UPDATE members
SET point_expire_at = DATE_ADD(NOW(), INTERVAL 6 MONTH)
WHERE membership = '프리미엄';
자동 업데이트 컬럼 외 추가 기록
UPDATE logs
SET updated_by = 'system',
updated_at = NOW()
WHERE event_type = '배치작업';
최근 활동 갱신용 트리거 생성 예시
CREATE TRIGGER update_user_activity
BEFORE UPDATE ON users
FOR EACH ROW
SET NEW.last_active = NOW();
트리거를 통해 자동으로 시간 기록을 관리할 수도 있다.
✅ 공식 문서 참고 링크
'DB' 카테고리의 다른 글
| [MySQL] DELETE 기본 문법 총정리 – 안전하게 데이터 삭제하는 법 (1) | 2025.07.02 |
|---|---|
| [MySQL] UPDATE 실패 원인과 해결법 완전 정복 – 수정이 안될 때 확인할 모든 것 (2) | 2025.07.01 |
| [MySQL] UPDATE 트랜잭션 적용하기: 데이터 무결성을 지키는 안전한 수정 전략 (1) | 2025.07.01 |
| [MySQL] UPDATE 문에서 NULL 처리하는 방법 완전 정리 (0) | 2025.07.01 |
| [MySQL] UPDATE + IF / CASE 문으로 조건부 데이터 수정하는 실전 가이드 (1) | 2025.06.30 |
| [MySQL] UPDATE + 서브쿼리 완전 정복 – 조건 기반 동적 수정의 핵심 기술 (0) | 2025.06.30 |
| [MySQL] UPDATE + JOIN 활용법 완전 정리 – 다중 테이블을 수정하는 강력한 방법 (0) | 2025.06.30 |
| [MySQL] UPDATE + WHERE (안전하고 정확한 데이터 수정 가이드) (0) | 2025.06.30 |