Programing/SQL

MySQL 날짜/시간 함수 정리 및 자주 쓰는 패턴 모음 (MySQL Date and Time Functions)

2025. 7. 5. 17:38
반응형

왜 날짜/시간 처리가 중요한가?

데이터베이스를 다루는 실무에서 날짜와 시간은 빠질 수 없는 요소입니다. 예약 시스템, 통계 분석, 매출 집계, 보고서 작성 등 대부분의 업무에서 시간 정보를 다뤄야 하며, MySQL은 이를 위한 다양한 함수를 제공합니다. 하지만 함수가 워낙 많다 보니 초보자부터 숙련자까지 종종 혼동을 겪곤 합니다. 이번 글에서는 MySQL 날짜/시간 함수의 기본과 실무에서 유용하게 쓸 수 있는 패턴들을 정리해보겠습니다.


A. 날짜/시간 관련 주요 함수

NOW(), CURDATE(), CURTIME()

  • NOW() : 현재 날짜와 시간을 반환합니다.

    SELECT NOW(); -- 2025-06-30 14:23:12
  • CURDATE() : 현재 날짜만 반환합니다.

    SELECT CURDATE(); -- 2025-06-30
  • CURTIME() : 현재 시간만 반환합니다.

    SELECT CURTIME(); -- 14:23:12

이 함수들은 로그 기록, 생성일·수정일 관리, 실시간 데이터 표시에 자주 활용됩니다.

DATE_ADD(), DATE_SUB()

  • 날짜를 더하거나 빼고 싶을 때 사용합니다.

    SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
    SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
  • 예약일 계산, 프로모션 기간 산출 등에 유용합니다.

DATEDIFF(), TIMESTAMPDIFF()

  • 두 날짜 사이의 차이를 구할 때 사용합니다.

    SELECT DATEDIFF('2025-07-10', '2025-06-30'); -- 10
    SELECT TIMESTAMPDIFF(MONTH, '2025-01-01', '2025-06-30'); -- 5
  • TIMESTAMPDIFF는 일 뿐 아니라 연도, 월, 시간 단위까지 선택할 수 있어 유연성이 큽니다.

DATE_FORMAT(), TIME_FORMAT()

  • 날짜와 시간을 원하는 형식으로 출력할 수 있습니다.

    SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');
    SELECT TIME_FORMAT(CURTIME(), '%H:%i');
  • 리포트 작성, 사용자 화면 표시 시 필수적으로 쓰입니다.

UNIX_TIMESTAMP(), FROM_UNIXTIME()

  • 유닉스 타임스탬프와 상호 변환할 때 사용됩니다.

    SELECT UNIX_TIMESTAMP('2025-06-30 14:23:12');
    SELECT FROM_UNIXTIME(1750000000);
  • 시스템 간 데이터 교환이나 로그 저장 시 중요합니다.


B. 자주 쓰는 패턴 모음

최근 7일간 데이터 조회

SELECT *
FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY);

이번 달 데이터만 가져오기

SELECT *
FROM sales
WHERE DATE_FORMAT(order_date, '%Y-%m') = DATE_FORMAT(NOW(), '%Y-%m');

특정 날짜 포맷으로 출력

SELECT DATE_FORMAT(NOW(), '%Y년 %m월 %d일 %H시 %i분');

두 날짜 간 차이 계산

SELECT DATEDIFF('2025-07-10', '2025-06-30') AS diff_days;

시간대별 방문자 수 집계

SELECT HOUR(created_at) AS hour_slot,
       COUNT(*) AS visit_count
FROM visit_log
WHERE created_at >= CURDATE()
GROUP BY HOUR(created_at);

분기별 데이터 집계

SELECT QUARTER(order_date) AS quarter,
       SUM(amount) AS total_sales
FROM orders
GROUP BY QUARTER(order_date);

특정 요일의 데이터만 조회

SELECT *
FROM attendance
WHERE DAYOFWEEK(work_date) = 2; -- 월요일

전월 대비 증감 계산

SELECT MONTH(order_date) AS month,
       SUM(amount) AS total_sales
FROM sales
WHERE order_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 2 MONTH)
                      AND LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH))
GROUP BY MONTH(order_date);

C. 실무 팁

인덱스와 날짜 조건 함께 쓰기

  • WHERE 절에서 컬럼에 함수를 적용하면 인덱스를 잘 활용하지 못합니다. 가능하다면 컬럼 그대로 비교하세요.

    -- 비추천
    WHERE DATE(created_at) = CURDATE();
    
    -- 추천
    WHERE created_at >= CURDATE()
      AND created_at < CURDATE() + INTERVAL 1 DAY;

BETWEEN vs >= AND <=

  • BETWEEN은 경계값을 포함하기 때문에 원하는 구간과 다를 수 있습니다. 특히 시간 단위 BETWEEN 사용 시 주의해야 합니다.

TIMEZONE 관리

  • 서버의 TIMEZONE과 애플리케이션의 TIMEZONE이 다르면 데이터가 어긋날 수 있습니다. 가능하면 일관되게 관리하거나 변환 로직을 추가하세요.

DATETIME vs TIMESTAMP

  • TIMESTAMP는 TIMEZONE에 따라 변동될 수 있고, DATETIME은 고정된 값으로 저장됩니다. 시스템 로직에 맞게 타입을 선택하세요.

예제 코드 모음

한 달 후 예약 확인

SELECT *
FROM reservations
WHERE reservation_date BETWEEN CURDATE()
                         AND DATE_ADD(CURDATE(), INTERVAL 1 MONTH);

최근 30일 매출 합계

SELECT SUM(amount)
FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);

전월 매출 조회

SELECT *
FROM sales
WHERE YEAR(order_date) = YEAR(CURDATE() - INTERVAL 1 MONTH)
  AND MONTH(order_date) = MONTH(CURDATE() - INTERVAL 1 MONTH);

일자별 주문 수 집계

SELECT DATE(order_date) AS order_day,
       COUNT(*) AS order_count
FROM orders
GROUP BY DATE(order_date);

주석 예시:

-- 각 날짜별 주문 건수 출력

참고 링크

  • https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
  • https://www.w3schools.com/sql/func_mysql_date_format.asp

MySQL 날짜/시간 함수는 방대하지만, 실무에서 자주 쓰는 것들부터 익히면 효율적으로 활용할 수 있습니다.

반응형

'Programing > SQL' 카테고리의 다른 글

GROUP BY, WHERE와 HAVING의 차이(SQL Basics Explained)  (2) 2025.07.03
WHERE 절과 JOIN에서의 쿼리 순서, 정말 중요할까?  (0) 2025.06.30
Mockaroo로 대용량 테스트 데이터 쉽게 생성하기  (4) 2025.06.30
SQL :: ORACLE :: 오라클 지우기  (0) 2008.12.01
SQL :: ORACLE :: 오라클 :: 자동증가값 :: 시퀸스 :: SEQUENCE  (1) 2008.11.30
SQL :: ORACLE :: 오라클 :: 사용자 계정 생성하기  (0) 2008.11.30
SQL :: 보안 관리 :: 끄적임  (0) 2008.11.26
SQL :: ORACLE :: 휴지인스턴스  (0) 2008.11.24
'Programing/SQL' 카테고리의 다른 글
  • GROUP BY, WHERE와 HAVING의 차이(SQL Basics Explained)
  • WHERE 절과 JOIN에서의 쿼리 순서, 정말 중요할까?
  • Mockaroo로 대용량 테스트 데이터 쉽게 생성하기
  • SQL :: ORACLE :: 오라클 지우기
Dongkkase
Dongkkase
개발자로 일하면서 부딪히는 문제풀이가 누군가에게 도움이 되길 바라며
    반응형
  • Dongkkase
    정집사의 개발로그
    Dongkkase
  • 전체
    오늘
    어제
    • All (478)
      • 금융 (61)
      • Programing (295)
        • Algorithm (39)
        • API (2)
        • javascript (122)
        • CSS (8)
        • HTML (10)
        • PHP (15)
        • JAVA (27)
        • JSP (17)
        • JSP 예제 (1)
        • IOS (1)
        • Android (1)
        • Sencha Touche (1)
        • bat file, cmd (0)
        • 디버깅 (2)
        • SQL (21)
        • MS-SQL (1)
        • MySQL (13)
        • 보안 (5)
      • Server (14)
        • Docker (1)
        • Windows (9)
        • Linux (3)
        • jeus (1)
      • Database (6)
      • IT 일반 (15)
      • 리뷰 (38)
        • Book (17)
        • 제품 (2)
        • 영화 소개 (11)
        • 음악 소개 (7)
      • 잡생각 (36)
        • 회고 (3)
        • 컬럼 (4)
        • 자료실 (6)
        • 낙서장 (12)
        • 위시리스트 (2)
        • WOW (1)
        • 덕 (1)
  • 인기 글

  • 최근 댓글

  • 태그

    jsp
    위시리스트
    기초
    php
    블로그
    SQL
    IT·컴퓨터
    Java
    자바스크립트
    자바
    디자인패턴
    JavaScript
    js패턴
    IT블로그
    자바스크립트유틸
    사고 싶은 책
    읽고 싶은 책
    It
    iT's MY LiFE
    IT 관련
Dongkkase
MySQL 날짜/시간 함수 정리 및 자주 쓰는 패턴 모음 (MySQL Date and Time Functions)
상단으로

티스토리툴바