MySQL에서는 날짜(date) 열과 시간(time) 열이 분리되어 저장되어 있는 경우가 많습니다. 이럴 때 CONCAT() 함수를 사용하면 두 열의 값을 하나의 날짜시간(DateTime) 형태로 결합하여 특정 날짜시간 값과 비교할 수 있습니다.
기본 문법
SELECT * FROM yourTableName WHERE CONCAT(yourDateColumnName, ' ', yourTimeColumnName) > 'yourDateTimeValue';
CONCAT() 함수로 날짜 열과 시간 열을 하나의 문자열로 연결한 뒤, WHERE 절에서 원하는 날짜시간 값과 비교하는 방식입니다.
예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다. 날짜를 저장하는 ArrivalDate 열과 시간을 저장하는 ArrivalTime 열로 구성된 테이블입니다.
mysql> create table DifferentDateTime
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ArrivalDate date,
-> ArrivalTime time
-> );
Query OK, 0 rows affected (1.53 sec)데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values(curdate(),'10:27:30');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values('2016-04-24','15:00:00');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values('2015-12-25','12:30:30');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values('2012-01-31','16:00:30');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DifferentDateTime(ArrivalDate,ArrivalTime) values('2000-07-12','09:45:31');
Query OK, 1 row affected (0.11 sec)전체 데이터 조회
SELECT 문으로 테이블에 저장된 모든 레코드를 확인해 보겠습니다.
mysql> select *from DifferentDateTime;
출력 결과
+----+-------------+-------------+ | Id | ArrivalDate | ArrivalTime | +----+-------------+-------------+ | 1 | 2019-02-14 | 10:27:30 | | 2 | 2016-04-24 | 15:00:00 | | 3 | 2015-12-25 | 12:30:30 | | 4 | 2012-01-31 | 16:00:30 | | 5 | 2000-07-12 | 09:45:31 | +----+-------------+-------------+ 5 rows in set (0.00 sec)
날짜와 시간을 결합하여 비교하기
이제 CONCAT() 함수를 사용해 ArrivalDate와 ArrivalTime 두 열을 결합하고, 특정 날짜시간 값보다 큰 레코드만 조회하는 쿼리입니다.
mysql> select *from DifferentDateTime where concat(ArrivalDate,' ',ArrivalTime) > '2007-01-31 12:30:30';
출력 결과
'2007-01-31 12:30:30'보다 이후인 날짜시간을 가진 레코드만 정상적으로 반환되었습니다.
+----+-------------+-------------+ | Id | ArrivalDate | ArrivalTime | +----+-------------+-------------+ | 1 | 2019-02-14 | 10:27:30 | | 2 | 2016-04-24 | 15:00:00 | | 3 | 2015-12-25 | 12:30:30 | | 4 | 2012-01-31 | 16:00:30 | +----+-------------+-------------+ 4 rows in set (0.00 sec)
참고 사항
CONCAT()으로 열을 결합하면 각 행마다 문자열 변환이 발생하므로, 데이터 양이 매우 많은 테이블에서는 인덱스를 활용하지 못해 성능이 저하될 수 있습니다. 대량 데이터를 자주 조회해야 하는 환경이라면 날짜와 시간을 하나의 DATETIME 열로 통합해 관리하는 것도 좋은 방법입니다.