개요
SQL을 사용하다 보면 특정 연도나 월에 해당하는 데이터를 조회하는 일이 자주 발생합니다. 예를 들어, 매월 데이터를 추출하거나, 특정 연도에 대한 분석을 진행할 때 이러한 조회가 필요합니다.
날짜 데이터를 다룰 때, DATE_FORMAT(), YEAR(), MONTH() 등의 함수와 BETWEEN 연산자, STR_TO_DATE()와 같은 함수들을 활용하면 원하는 데이터를 손쉽게 필터링할 수 있습니다.
본 포스팅에서는 특정 년도와 월에 해당하는 데이터를 조회하는 여러 가지 방법을 정리하고자 합니다.
DATE_FORMAT()
년-월 포맷으로 비교
-- 연도만 비교
SELECT * FROM 테이블명
WHERE DATE_FORMAT(날짜컬럼, '%Y') = '2022';
-- 년월 비교
SELECT * FROM 테이블명
WHERE DATE_FORMAT(날짜컬럼, '%Y%m') = '202210';
DATE_FORMAT()을 사용하여 YYYY-MM 형식으로 날짜를 포맷한 뒤, 2022년 10월에 해당하는 데이터를 조회할 수 있습니다.
주의 사항 ❗️
DATE_FORMAT()함수는 내부적으로 문자열로 처리되기 때문에 성능이 중요한 대규모 데이터베이스에서는 효율성이 떨어질 수 있습니다.
YEAR() & MONTH()
연도와 월로 분리하여 비교
SELECT * FROM 테이블명
WHERE YEAR(날짜컬럼) = 2022 AND MONTH(날짜컬럼) = 10;
YEAR() 함수로 연도를, MONTH() 함수로 월을 추출하여 비교하는 방법입니다.
BETWEEN 연산자
범위 지정
SELECT * FROM 테이블명
WHERE 날짜컬럼 BETWEEN '2022-10-01' AND '2022-10-31';
BETWEEN 연산자를 사용하여 날짜 범위를 2022-10-01부터 2022-10-31까지 지정하는 방법입니다.
DATE 타입
부분 문자열 비교
SELECT * FROM 테이블명
WHERE DATE_FORMAT(날짜컬럼, '%Y-%m') LIKE '2022-10';
LIKE 연산자를 사용하여 YYYY-MM 형식의 문자열로 비교하는 방법입니다. 이 방법은 날짜 컬럼이 VARCHAR 또는 CHAR 타입일 때 유용할 수 있습니다.
YEAR() + MONTH()
연도와 월을 문자열로 연결
SELECT * FROM 테이블명
WHERE CONCAT(YEAR(날짜컬럼), LPAD(MONTH(날짜컬럼), 2, '0')) = '202210';
YEAR()와 MONTH()를 CONCAT()을 사용해 문자열로 결합하여 비교할 수도 있습니다. 위 쿼리는
LPAD()
- LPAD()는 MySQL에서 문자열을 왼쪽으로 패딩(padding)하는 함수입니다.
- 즉, 문자열의 길이가 지정된 길이보다 짧을 경우, 주어진 문자를 왼쪽에 추가하여 지정된 길이에 맞는 문자열을 만듭니다.
LPAD(MONTH(날짜컬럼), 2, '0')에서 2는 월을 두 자리로 맞추기 위한 자리수를 의미합니다.
TIMESTAMP()
날짜와 시간 포함
SELECT * FROM 테이블명
WHERE 날짜컬럼 >= '2022-10-01 00:00:00' AND 날짜컬럼 < '2022-11-01 00:00:00';
TIMESTAMP 타입이라면 특정 날짜 범위를 TIMESTAMP 형식으로 지정할 수 있습니다.
STR_TO_DATE()
날짜 포맷을 맞추어 비교
SELECT * FROM 테이블명
WHERE STR_TO_DATE(DATE_FORMAT(날짜컬럼, '%Y-%m'), '%Y-%m') = '2022-10';
STR_TO_DATE()를 사용하여 문자열을 날짜로 변환하여 비교할 수 있습니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.11.14 - A/B 테스트: 데이터 기반 의사결정의 힘 (0) | 2024.11.14 |
---|---|
[TIL, 일일 회고] 2024.11.13 - BigInteger 클래스의 mod() 함수 알아보기 (0) | 2024.11.13 |
[TIL, 일일 회고] 2024.11.11 - Java에서 소수점 반올림하는 방법 (Math.round(), String.format()) (0) | 2024.11.11 |
[TIL, 일일 회고] 2024.11.10 - RBAC와 ABAC란 무엇일까❓ (0) | 2024.11.10 |
[TIL, 일일 회고] 2024.11.09 - toBinaryString()와 toString() 메서드의 속도차이 비교하기 (2) | 2024.11.09 |