Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 사용자 지정 형식의 최소 날짜 조회 방법 (CONCAT + MIN 활용)

MySQL에서 날짜가 일(day), 월(month), 연도(year)로 분리되어 저장된 경우, 그중 가장 이른 날짜 즉 최솟값을 어떻게 구할 수 있을까요? 이 글에서는 CONCAT 함수와 MIN 함수를 조합하여 사용자 지정 형식의 날짜 중 최소 날짜를 조회하는 방법을 단계별로 살펴봅니다.

1. 예제 테이블 생성하기

먼저 실습에 사용할 테이블을 만들어 보겠습니다. 아래 쿼리는 날짜 정보를 세 개의 varchar 컬럼에 나누어 저장하는 구조입니다.

mysql> create table FindMinimumDate
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> yourDay varchar(2),
-> yourMonth varchar(2),
-> yourYear varchar(4),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.57 sec)

2. 샘플 데이터 삽입하기

INSERT 문을 사용해 테스트용 레코드 여러 개를 입력합니다.

mysql> insert into FindMinimumDate(yourDay,yourMonth,yourYear) values('21','11','2019');
Query OK, 1 row affected (0.10 sec)

mysql> insert into FindMinimumDate(yourDay,yourMonth,yourYear) values('20','10','2020');
Query OK, 1 row affected (0.38 sec)

mysql> insert into FindMinimumDate(yourDay,yourMonth,yourYear) values('03','08','2014');
Query OK, 1 row affected (0.17 sec)

mysql> insert into FindMinimumDate(yourDay,yourMonth,yourYear) values('04','09','2017');
Query OK, 1 row affected (0.12 sec)

mysql> insert into FindMinimumDate(yourDay,yourMonth,yourYear) values('05','07','2013');
Query OK, 1 row affected (0.12 sec)

mysql> insert into FindMinimumDate(yourDay,yourMonth,yourYear) values('25','12','2016');
Query OK, 1 row affected (0.08 sec)

3. 저장된 데이터 확인하기

SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.

mysql> select *from FindMinimumDate;

실행 결과는 다음과 같습니다.

+----+---------+-----------+----------+
| Id | yourDay | yourMonth | yourYear |
+----+---------+-----------+----------+
| 1 | 21 | 11 | 2019 |
| 2 | 20 | 10 | 2020 |
| 3 | 03 | 08 | 2014 |
| 4 | 04 | 09 | 2017 |
| 5 | 05 | 07 | 2013 |
| 6 | 25 | 12 | 2016 |
+----+---------+-----------+----------+
6 rows in set (0.00 sec)

4. 최소 날짜 조회 쿼리 실행하기

핵심 아이디어는 간단합니다. CONCAT 함수로 '연도-월-일' 형태의 문자열을 만든 뒤, MIN 함수로 그중 최솟값을 구하는 것입니다. YYYY-MM-DD 형식은 문자열 기준으로 정렬해도 시간순과 동일한 결과가 나오기 때문에, 별도의 타입 변환 없이도 정확한 답을 얻을 수 있습니다.

mysql> select min(concat(yourYear,'-',yourMonth,'-',yourDay)) as MinimumDate from FindMinimumDate;

실행 결과, 가장 이른 날짜가 정상적으로 반환됩니다.

+-------------+
| MinimumDate |
+-------------+
| 2013-07-05 |
+-------------+
1 row in set (0.00 sec)

6개의 레코드 중 가장 오래된 날짜인 2013-07-05가 출력되었습니다.

추가 팁: STR_TO_DATE로 DATE 타입 변환하기

결괏값을 문자열이 아닌 진짜 DATE 타입으로 얻고 싶다면 STR_TO_DATE 함수를 함께 사용할 수 있습니다.

mysql> select min(str_to_date(concat(yourYear,'-',yourMonth,'-',yourDay), '%Y-%m-%d')) as MinimumDate from FindMinimumDate;

이 방식은 반환값이 DATE 타입이므로 이후 날짜 연산(DATEDIFF, DATE_ADD 등)에 바로 활용할 수 있다는 장점이 있습니다.

정리

날짜가 컬럼별로 분리되어 저장된 경우에도 CONCAT으로 YYYY-MM-DD 형식의 문자열을 만들면 MIN 함수를 통해 손쉽게 최소 날짜를 구할 수 있습니다. 다만 성능과 데이터 무결성 측면에서는 애초에 DATE 타입으로 저장하는 것이 권장된다는 점도 함께 기억해 두시길 바랍니다.