본문 바로가기
DataBase

MySQL의 `NOW()`와 `SYSDATE()` 차이점 완벽 정리

by 대박플머 2024. 12. 31.

소개

MySQL에서 현재 날짜와 시간을 가져오는 방법에는 여러 가지가 있지만, 그중에서도 가장 널리 사용되는 함수는 NOW()SYSDATE()입니다. 두 함수 모두 비슷해 보이지만, 실제로는 동작 방식에서 중요한 차이점이 있습니다. 이 글에서는 NOW()SYSDATE()의 차이점, 각 함수의 특징, 그리고 언제 어떤 함수를 사용해야 하는지에 대해 자세히 알아보겠습니다.


MySQL Documents URL

1. NOW() 함수

NOW() 함수는 MySQL에서 현재 날짜와 시간을 반환하는 가장 일반적으로 사용되는 함수입니다. 이 함수는 SQL 문이 실행될 때의 날짜와 시간을 반환합니다.

문법:

SELECT NOW();

특징:

  • NOW()는 SQL 문이 시작될 때의 날짜와 시간을 반환합니다.
  • 트랜잭션 내에서 동일한 NOW() 호출은 항상 동일한 결과를 반환합니다. 즉, 트랜잭션이 진행되는 동안 동일한 값이 유지됩니다.
  • 일반적으로 로그나 타임스탬프 기록에 사용됩니다.

예제:

START TRANSACTION;
SELECT NOW(); -- 2024-10-01 10:00:00
-- 몇 2초 후
SLEEP(2);

SELECT NOW(); -- 2024-10-01 10:00:00
COMMIT;

위 예제에서 NOW()는 트랜잭션이 시작될 때의 시간만 반환하며, 트랜잭션이 끝날 때까지 동일한 값을 유지합니다.


2. SYSDATE() 함수

SYSDATE() 함수 역시 현재 날짜와 시간을 반환하지만, NOW()와는 동작 방식이 다릅니다.

문법:

SELECT SYSDATE();

특징:

  • SYSDATE()는 함수가 호출될 때마다 실제 시스템의 현재 날짜와 시간을 반환합니다.
  • 트랜잭션 내에서 SYSDATE()를 여러 번 호출하면 그때그때의 시스템 시각이 반환됩니다.
  • 실시간으로 시간을 체크해야 하는 상황에서 유용합니다.

예제:

START TRANSACTION;
SELECT SYSDATE(); -- 2024-10-01 10:00:00
-- 몇 초 후
SELECT SYSDATE(); -- 2024-10-01 10:00:05
COMMIT;

위 예제에서 SYSDATE()는 호출될 때마다 현재 시간을 반환하기 때문에 서로 다른 값이 반환됩니다.


3. NOW()SYSDATE()의 주요 차이점

구분 NOW() SYSDATE()
호출 시점 SQL 문 실행 시점 함수 호출 시점
트랜잭션 내 동일한 값 유지 호출될 때마다 업데이트된 값 반환
사용 사례 트랜잭션 내 일관성 유지 필요 시 실시간 데이터 수집 필요 시
  • 호출 시점 차이: NOW()는 SQL 문이 실행되는 시점의 시간을 반환하고, SYSDATE()는 호출되는 순간의 시간을 반환합니다.
  • 트랜잭션 내 동작: NOW()는 트랜잭션이 시작될 때의 시간을 반환하며, 트랜잭션 내에서 변경되지 않습니다. 반면에 SYSDATE()는 트랜잭션 중에도 호출될 때마다 최신 시간을 반환합니다.

4. NOW()SYSDATE()의 차이를 확인하는 실습 예제

-- 테이블 생성
CREATE TABLE test_times (
    id INT AUTO_INCREMENT PRIMARY KEY,
    now_time DATETIME,
    sysdate_time DATETIME
);

-- 데이터 삽입
START TRANSACTION;
INSERT INTO test_times (now_time, sysdate_time) VALUES (NOW(), SYSDATE());
-- 약 10초 정도 대기한 후
INSERT INTO test_times (now_time, sysdate_time) VALUES (NOW(), SYSDATE());
COMMIT;

-- 결과 확인
SELECT * FROM test_times;

결과 예시:

id now_time sysdate_time
1 2024-10-01 10:00:00 2024-10-01 10:00:00
2 2024-10-01 10:00:00 2024-10-01 10:00:10

위의 결과를 통해 NOW()는 트랜잭션 내에서 동일한 값을 유지하지만, SYSDATE()는 호출될 때마다 변경되는 것을 확인할 수 있습니다.


5. NOW()SYSDATE()의 활용 예시

1) NOW() 사용 예시

NOW()는 일반적으로 데이터베이스에 레코드를 삽입하거나 업데이트할 때 타임스탬프를 기록하기 위해 사용됩니다.

-- 사용자의 로그인 기록을 남기는 테이블에 현재 시간 삽입
INSERT INTO user_login_logs (user_id, login_time) VALUES (123, NOW());

2) SYSDATE() 사용 예시

SYSDATE()는 실시간으로 시간이 중요한 경우, 예를 들어 이벤트 로깅이나 실시간 데이터 처리가 필요한 경우에 사용됩니다.

-- 실시간 이벤트 발생 시각 기록
INSERT INTO event_logs (event_name, event_time) VALUES ('user_click', SYSDATE());

6. NOW()SYSDATE()의 성능 비교

NOW()SYSDATE()는 보통 성능 면에서 큰 차이가 없지만, SYSDATE()는 호출 시점에 시스템 시간을 계속 조회하기 때문에 대규모 트랜잭션에서 다수의 호출이 있을 경우 약간의 오버헤드가 발생할 수 있습니다. 그러나 대부분의 일반적인 애플리케이션에서는 이 차이가 미미하므로 성능보다는 사용 목적에 따라 적절한 함수를 선택하는 것이 중요합니다.


7. NOW()SYSDATE() 사용 시 주의사항

  1. 복잡한 트랜잭션에서의 일관성: 트랜잭션 내에서 일관된 시간 값을 유지해야 한다면 NOW()를 사용하는 것이 좋습니다. SYSDATE()는 호출 시마다 시간이 달라지기 때문에 데이터 일관성이 필요한 상황에서는 적합하지 않습니다.
  2. 실시간 이벤트 로깅: 실시간 데이터 처리가 필요한 경우 SYSDATE()를 사용해야 더 정확한 시각 정보를 얻을 수 있습니다.

8. 언제 NOW()를 사용하고 언제 SYSDATE()를 사용해야 할까?

  • NOW() 사용 추천 시점:
    • 트랜잭션 내에서 일관된 시간 값을 유지해야 할 때
    • 로그나 데이터 변경 시점 기록에 주로 사용
  • SYSDATE() 사용 추천 시점:
    • 실시간으로 현재 시간을 수집해야 할 때
    • 각 SQL 호출마다 정확한 시간을 기록해야 할 때

결론

NOW()SYSDATE()는 모두 현재 날짜와 시간을 반환하는 데 사용되지만, 각 함수의 동작 방식과 특징이 다르기 때문에 적절한 상황에서 선택적으로 사용하는 것이 중요합니다. 트랜잭션의 일관성이 필요한 경우에는 NOW()를, 실시간 데이터 처리가 필요한 경우에는 SYSDATE()를 사용하면 됩니다. 이 차이점을 이해하면 MySQL에서 더욱 정확하고 효과적으로 시간 데이터를 처리할 수 있을 것입니다.