DB

[MySQL] UPDATE + NOW() 함수로 날짜 자동 수정하는 실전 활용법

인생아 2025. 6. 30. 23:57
반응형

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();

트리거를 통해 자동으로 시간 기록을 관리할 수도 있다.

✅ 공식 문서 참고 링크

반응형