두 개의 날짜(DATE) 열 사이에 오늘 날짜가 포함되는 MySQL 행을 조회하려면 AND 연산자를 사용해야 합니다. 기본 구문은 다음과 같습니다.
SELECT * FROM yourTableName WHERE yourDateColumnName1 <= 'yourDateValue' AND yourDateColumnName2 >= 'yourDateValue';
즉, 시작 날짜 열이 조회하려는 날짜보다 작거나 같고, 동시에 종료 날짜 열이 그 날짜보다 크거나 같은 조건을 모두 만족하는 행만 반환됩니다.
예제 테이블 생성
구문을 실제로 이해하기 위해 예제 테이블을 먼저 생성해 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table selectDates -> ( -> Id int NOT NULL AUTO_INCREMENT, -> StartingDate date, -> EndingDate date, -> PRIMARY KEY(Id) -> ); Query OK, 0 rows affected (0.80 sec)
생성된 테이블에는 시작 날짜(StartingDate)와 종료 날짜(EndingDate)라는 두 개의 DATE 열이 있습니다.
샘플 데이터 삽입
이제 INSERT 명령을 사용하여 테이블에 여러 개의 레코드를 삽입합니다. 쿼리는 다음과 같습니다.
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-11','2019-01-23');
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-10','2019-01-23');
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-30','2019-01-30');
Query OK, 1 row affected (0.12 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-10-14','2019-10-28');
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-10-14','2019-10-20');
Query OK, 1 row affected (0.19 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-11-17','2019-11-19');
Query OK, 1 row affected (0.52 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-12-21','2019-12-31');
Query OK, 1 row affected (0.19 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-06','2019-01-21');
Query OK, 1 row affected (0.16 sec)
mysql> insert into selectDates(StartingDate,EndingDate) values('2019-01-07','2019-01-17');
Query OK, 1 row affected (0.18 sec)전체 데이터 확인
SELECT 문을 사용하여 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from selectDates;
실행 결과는 다음과 같습니다.
+----+--------------+------------+ | Id | StartingDate | EndingDate | +----+--------------+------------+ | 1 | 2019-01-11 | 2019-01-23 | | 2 | 2019-01-10 | 2019-01-23 | | 3 | 2019-01-30 | 2019-01-30 | | 4 | 2019-10-14 | 2019-10-28 | | 5 | 2019-10-14 | 2019-10-20 | | 6 | 2019-11-17 | 2019-11-19 | | 7 | 2019-12-21 | 2019-12-31 | | 8 | 2019-01-06 | 2019-01-21 | | 9 | 2019-01-07 | 2019-01-17 | +----+--------------+------------+ 9 rows in set (0.00 sec)
특정 날짜가 두 열 사이에 있는 행 조회하기
이제 '2019-01-10'이라는 날짜가 시작 날짜와 종료 날짜 사이에 포함되는 행만 선택하는 쿼리를 실행해 보겠습니다.
select *from selectDates where StartingDate <= '2019-01-10' AND EndingDate >= '2019-01-10';
실행 결과는 다음과 같습니다.
+----+--------------+------------+ | Id | StartingDate | EndingDate | +----+--------------+------------+ | 2 | 2019-01-10 | 2019-01-23 | | 8 | 2019-01-06 | 2019-01-21 | | 9 | 2019-01-07 | 2019-01-17 | +----+--------------+------------+ 3 rows in set (0.00 sec)
위 결과를 보면 Id 2, 8, 9번 행의 경우 시작 날짜가 '2019-01-10' 이전 또는 당일이면서, 종료 날짜가 '2019-01-10' 이후 또는 당일인 것을 확인할 수 있습니다. 나머지 행들은 두 조건 중 하나라도 만족하지 않기 때문에 결과에서 제외됩니다.
오늘 날짜를 동적으로 적용하기
실무에서는 고정된 날짜 값 대신 현재 날짜를 자동으로 사용하는 것이 더 유용합니다. 이때 MySQL의 CURDATE() 함수를 활용하면 됩니다.
select *from selectDates where StartingDate <= CURDATE() AND EndingDate >= CURDATE();
이렇게 하면 쿼리를 실행하는 시점의 오늘 날짜가 두 DATE 열 사이에 포함되는 행만 자동으로 조회됩니다. 예약 기간, 프로모션 기간, 유효 기간 등 특정 시점이 시작일과 종료일 사이에 속하는 데이터를 찾아야 하는 상황에서 매우 유용하게 활용할 수 있습니다.