데이터/SQL

[MySQL vs. Hive] 날짜 관련 SQL 함수 총정리

glasslego 2025. 3. 6. 17:00

1. MySQL 날짜/시간 함수

1.1 현재 날짜·시간 조회

  • NOW(): 현재 날짜와 시간을 반환 (예: YYYY-MM-DD HH:MM:SS)
  • CURDATE(): 현재 날짜만 반환 (예: YYYY-MM-DD)
  • CURTIME(): 현재 시각만 반환 (예: HH:MM:SS)
SELECT NOW() AS current_datetime,
       CURDATE() AS current_date,
       CURTIME() AS current_time;

1.2 날짜 연산

  • DATE_ADD(date, INTERVAL n unit): 지정한 날짜에 일/월/년 등을 더함
  • DATE_SUB(date, INTERVAL n unit): 지정한 날짜에서 일/월/년 등을 뺌
  • DATEDIFF(date1, date2): date1과 date2의 일자 차이(date1 - date2)
-- 오늘 날짜에서 7일 뒤
SELECT DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS plus_7_days;

-- 오늘 날짜에서 1개월 전
SELECT DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AS minus_1_month;

-- 두 날짜 간의 일수 차이
SELECT DATEDIFF('2025-03-10', '2025-03-01') AS day_diff;

1.3 날짜 구성 요소 추출

  • YEAR(date), MONTH(date), DAY(date): 날짜에서 연/월/일 추출
  • HOUR(time), MINUTE(time), SECOND(time): 시간에서 시/분/초 추출
SELECT YEAR(NOW())  AS current_year,
       MONTH(NOW()) AS current_month,
       DAY(NOW())   AS current_day;

1.4 날짜 포맷 변환

  • DATE_FORMAT(date, format): MySQL 날짜를 특정 문자열 형식으로 변환
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d') AS date_only,
       DATE_FORMAT(NOW(), '%Y년 %m월 %d일') AS date_kor,
       DATE_FORMAT(NOW(), '%H:%i:%s') AS time_only;
  • 주요 포맷 기호:
    • %Y : 4자리 연도 (2025)
    • %m : 2자리 월 (01~12)
    • %d : 2자리 일 (01~31)
    • %H : 24시간(00~23), %i : 분, %s : 초

1.5 문자열 ↔ 날짜 변환

  • STR_TO_DATE(string, format): 문자열을 날짜로 변환
  • DATE_FORMAT()(위에서 소개)와 반대로, 날짜를 문자열로 변환
SELECT STR_TO_DATE('2025-03-15', '%Y-%m-%d') AS date_value;

1.6 UNIX Timestamp 관련

  • UNIX_TIMESTAMP(): 현재 시간을 1970-01-01 00:00:00 UTC부터의 초 단위로 반환
  • FROM_UNIXTIME(timestamp): 유닉스 타임스탬프를 날짜로 변환
-- 현재 시각 타임스탬프
SELECT UNIX_TIMESTAMP() AS current_unix_ts;

-- 특정 타임스탬프 → 날짜
SELECT FROM_UNIXTIME(1678000000) AS readable_time;

1.7 TIMESTAMPDIFF, TIMESTAMPADD

  • TIMESTAMPDIFF(unit, datetime1, datetime2): 두 시각 차이를 지정한 단위로 반환
  • TIMESTAMPADD(unit, value, datetime): 시각에 특정 단위·값을 더함
-- 분 단위 차이
SELECT TIMESTAMPDIFF(MINUTE, '2025-03-10 10:00:00', '2025-03-10 12:00:00') AS diff_min;

-- 시각에 30분 더하기
SELECT TIMESTAMPADD(MINUTE, 30, '2025-03-10 12:00:00') AS plus_30min;

2. Hive 날짜/시간 함수

Hive는 빅데이터 환경에서 동작하기 때문에, SQL 표준과는 조금 다른 함수를 제공하기도 합니다. 또한 Hive 버전에 따라 지원하는 함수가 다를 수 있으니, 사용 중인 Hive 버전을 꼭 확인하세요.

2.1 현재 날짜·시간

  • CURRENT_DATE: 현재 날짜 (예: 2025-03-10)
  • CURRENT_TIMESTAMP: 현재 날짜와 시간(타임스탬프)
  • FROM_UNIXTIME(unixtime[, format]): 유닉스 타임스탬프를 날짜/시간으로 변환
  • UNIX_TIMESTAMP([string date][, string pattern]): 날짜/문자열을 유닉스 타임스탬프로 변환하거나 현재 타임스탬프 반환
SELECT CURRENT_DATE          AS hive_current_date,
       CURRENT_TIMESTAMP     AS hive_current_timestamp,
       UNIX_TIMESTAMP()      AS hive_unix_ts,
       FROM_UNIXTIME(UNIX_TIMESTAMP()) AS hive_current_datetime_str;

2.2 날짜 형식 변환

  • date_format(timestamp, fmt) (Hive 1.2 이후)
    → MySQL의 DATE_FORMAT()과 유사
SELECT date_format(CURRENT_TIMESTAMP, 'yyyy-MM-dd HH:mm:ss') AS date_str;
  • Hive에서 포맷 문자열은 자바 SimpleDateFormat 기준을 따릅니다. (예: yyyy, MM, dd, HH, mm, ss 등)

2.3 날짜 연산

  • date_add(date, int days): 특정 날짜에 일수를 더함
  • date_sub(date, int days): 특정 날짜에서 일수를 뺌
  • DATEDIFF(date1, date2): date1과 date2 간의 일자 차이
SELECT date_add('2025-03-10', 7)     AS plus_7_days,   -- 2025-03-17
       date_sub('2025-03-10', 3)     AS minus_3_days,  -- 2025-03-07
       datediff('2025-03-15', '2025-03-10') AS day_diff;  -- 5

Hive의 date_add, date_sub는 MySQL과는 다르게 INTERVAL 키워드를 사용하지 않습니다.
바로 일수(int)를 매개변수로 넣어줍니다.

2.4 EXTRACT() vs. YEAR() / MONTH() / DAY()

Hive에는 EXTRACT() 함수를 직접 지원하지 않는 버전이 많으며, 대신 year(date/timestamp), month(date/timestamp), day(date/timestamp) 같은 함수를 제공하거나 date_format()을 활용합니다.

  • year(timestamp): 연도(int) 반환
  • month(timestamp): 월(int) 반환
  • day(timestamp): 일(int) 반환 (Hive 2.1+)
  • hour(timestamp), minute(timestamp), second(timestamp) (각각 가능한 버전이 다를 수 있음)
SELECT year(CURRENT_TIMESTAMP)  AS current_year,
       month(CURRENT_TIMESTAMP) AS current_month;

예시: date_format()로 추출하기

SELECT date_format(current_timestamp, 'yyyy') AS current_year_string,
       date_format(current_timestamp, 'MM')   AS current_month_string;

2.5 날짜 문자열 파싱 (to_date, cast)

  • to_date(string): 문자열(또는 타임스탬프)을 yyyy-MM-dd 형식으로 변환
  • cast(timestamp AS date): 타임스탬프를 날짜 형식으로 변환
SELECT to_date('2025-03-10 14:00:00') AS hive_date_only;
-- 결과: 2025-03-10

SELECT cast('2025-03-10 14:00:00' AS date) AS hive_date_only2;

2.6 UNIX_TIMESTAMP() / FROM_UNIXTIME()

Hive도 MySQL과 비슷하게 유닉스 타임스탬프를 다루지만, 인수와 포맷에서 약간 차이가 있을 수 있습니다.

-- 현재 시각의 유닉스 타임스탬프
SELECT UNIX_TIMESTAMP() AS hive_unix_ts;

-- 특정 문자열 → 유닉스 타임스탬프
SELECT UNIX_TIMESTAMP('2025-03-10 14:00:00', 'yyyy-MM-dd HH:mm:ss') AS custom_unix_ts;

-- 타임스탬프 → 문자열
SELECT FROM_UNIXTIME(1678000000, 'yyyy-MM-dd HH:mm:ss') AS readable_time;

3. MySQL vs. Hive 주요 차이 요약

기능  MySQL 예시 Hive 예시
현재 날짜·시간 NOW(), CURDATE(), CURTIME() CURRENT_DATE, CURRENT_TIMESTAMP
날짜 연산 DATE_ADD('2025-03-10', INTERVAL 7 DAY) date_add('2025-03-10', 7)
날짜 차이 DATEDIFF(date1, date2) datediff(date1, date2)
날짜 포맷 DATE_FORMAT(date, '%Y-%m-%d') date_format(timestamp, 'yyyy-MM-dd')
날짜 파싱 STR_TO_DATE('2025-03-10', '%Y-%m-%d') to_date('2025-03-10 14:00:00') / cast(... as date)
연·월·일 추출 YEAR(date), MONTH(date), DAY(date) year(timestamp), month(timestamp), day(timestamp)
유닉스 타임스탬프 UNIX_TIMESTAMP(),
FROM_UNIXTIME(ts)
UNIX_TIMESTAMP(),
FROM_UNIXTIME(ts, 'yyyy-MM-dd HH:mm:ss')
INTERVAL 키워드 사용 INTERVAL n unit 사용 사용하지 않음 (바로 정수·문자열)
날짜 타입 DATE, DATETIME, TIMESTAMP DATE, TIMESTAMP
(Hive 1.x 이전에는 TIMESTAMP 지원이 제한적)
포맷 문자열 표준 MySQL 전용(주로 %Y, %m, %d) Java SimpleDateFormat(주로 yyyy, MM, dd)

4. 예시 시나리오: 특정 기간의 주문 집계

4.1 MySQL에서:

SELECT DATE(order_date) AS order_day,
       SUM(amount)      AS total_revenue
FROM orders
WHERE order_date BETWEEN '2025-03-01' AND '2025-03-10'
GROUP BY DATE(order_date)
ORDER BY order_day;
  • BETWEEN으로 날짜 범위 지정
  • DATE() 함수로 일자만 추출

4.2 Hive에서:

SELECT to_date(order_date) AS order_day,
       SUM(amount)         AS total_revenue
FROM orders
WHERE order_date BETWEEN '2025-03-01' AND '2025-03-10'
GROUP BY to_date(order_date)
ORDER BY order_day;
  • Hive에서는 to_date(order_date) 로 날짜 부분만 추출
  • 문자열 비교일 경우 '2025-03-10' < '2025-03-2' 등과 같은 에러가 나지 않도록 주의
  • Hive 테이블의 order_date 컬럼이 string 타입이라면, 실제 비교 시에는 order_date >= '2025-03-01' AND order_date <= '2025-03-10' 식으로 처리해도 됩니다.

5. 마무리

  • MySQL 환경과 Hive 환경은 날짜/시간 함수를 사용하는 문법이 조금 다릅니다.
  • MySQL은 RDBMS로서 전통적인 SQL 표준에 가깝고, INTERVAL 키워드를 자주 사용하는 반면 Hive는 빅데이터 ETL/분석 용도로서 Java 날짜 포맷date_add(int) 방식을 사용합니다.
  • 주로 데이터웨어하우스(ETL)나 로그 분석 과정에서는 Hive를 이용하고, 애플리케이션 트랜잭션 처리나 실시간 서비스는 MySQL을 많이 사용하게 되므로, 두 시스템의 함수 차이를 잘 숙지하면 좋습니다.

이상으로 MySQL vs. Hive 날짜/시간 함수 정리를 마치겠습니다.
프로젝트나 업무에서 다양한 시간 연산 및 포맷팅이 필요하다면, 이 포스팅을 참조하시기 바랍니다!

Tip: 실제로는 Spark SQL, Presto, PostgreSQL 등 각 DBMS마다 날짜 함수가 조금씩 다릅니다. 프로젝트에서 사용하는 DBMS에 맞춰 공식 레퍼런스를 확인하는 습관을 들이세요.

'데이터 > SQL' 카테고리의 다른 글

SQL 초보 문법 가이드  (0) 2025.03.06