MySQL에서 DATETIME 타입의 컬럼에 저장된 시간(hour) 값을 기준으로 특정 조건에 맞는 데이터를 추출하는 방법을 알아보겠습니다. 이번 예제에서는 EXTRACT() 함수와 BETWEEN 연산자를 활용하여 원하는 시간대의 레코드만 필터링하는 쿼리를 살펴봅니다.
1. 테이블 생성하기
먼저 DATETIME 타입의 컬럼을 가진 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> AdmissionDate datetime
-> );
Query OK, 0 rows affected (0.75 sec)
DATETIME 타입은 날짜와 시간 정보를 함께 저장할 수 있어, 이후 시간 단위의 조건 처리에 유용합니다.
2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('2019-01-10 10:45:10');
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable values('2019-02-12 20:50:00');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('2019-02-12 16:10:19');
Query OK, 1 row affected (0.15 sec)3. 전체 데이터 확인하기
SELECT 문을 사용하여 테이블에 저장된 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
출력 결과
+---------------------+
| AdmissionDate |
+---------------------+
| 2019-01-10 10:45:10 |
| 2019-02-12 20:50:00 |
| 2019-02-12 16:10:19 |
+---------------------+
3 rows in set (0.00 sec)
4. 시간 조건으로 데이터 필터링하기
이제 EXTRACT(HOUR FROM ...) 함수를 사용하여 입학 시간(AdmissionDate)의 '시' 값이 8시에서 10시 사이에 포함되지 않는 레코드만 추출하는 쿼리를 실행해 보겠습니다.
mysql> select *from DemoTable where EXTRACT(HOUR from AdmissionDate) not between 8 and 10;
출력 결과
+---------------------+
| AdmissionDate |
+---------------------+
| 2019-02-12 20:50:00 |
| 2019-02-12 16:10:19 |
+---------------------+
2 rows in set (0.00 sec)
쿼리 결과 분석
실행 결과를 보면 세 개의 레코드 중 두 개만 반환되었습니다. 그 이유는 다음과 같습니다.
'2019-01-10 10:45:10'의 경우 시간(hour)이 10이므로 BETWEEN 8 AND 10 범위에 포함되어 제외되었고, 나머지 두 레코드는 각각 20시와 16시로 해당 범위 밖이기 때문에 결과에 포함된 것입니다.
참고: NOT BETWEEN 대신 OR 조건 사용하기
동일한 결과를 얻기 위해 부울 논리(OR 조건)를 명시적으로 사용할 수도 있습니다.
mysql> select *from DemoTable
-> where EXTRACT(HOUR from AdmissionDate) < 8
-> or EXTRACT(HOUR from AdmissionDate) > 10;
이처럼 NOT BETWEEN 구문은 '< 8 OR > 10' 조건과 논리적으로 동일하며, 코드가 더 간결하고 가독성이 좋다는 장점이 있습니다. 상황에 따라 더 직관적인 방식을 선택하여 사용하면 됩니다.