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 |
---|