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

MySQL 쿼리로 이틀 사이 다음으로 가장 가까운 날짜 구하기

MySQL에서 이틀 사이 다음으로 가장 가까운 날짜 조회하기

MySQL에서 현재 시점을 기준으로 두 날짜 사이에서 다음으로 가장 가까운 날짜를 조회하려면 ORDER BY 절과 CASE 표현식을 조합하면 됩니다. 기본 문법은 다음과 같습니다.

select * from yourTableName
order by ( yourColumnName > now()) desc, (case when yourColumnName > now() then yourColumnName end) ,
    yourColumnName  desc
limit 1;

쿼리 동작 원리

이 쿼리가 어떻게 동작하는지 단계별로 살펴보겠습니다.

  • (yourColumnName > now()) desc : 현재 시간보다 미래인 날짜를 우선 정렬합니다. 조건이 참이면 1, 거짓이면 0을 반환하므로 내림차순 정렬 시 미래 날짜가 앞쪽에 위치합니다.
  • (case when ... then ... end) : 미래 날짜들끼리는 오름차순으로 정렬되어 현재와 가장 가까운 미래 날짜가 맨 앞에 옵니다.
  • yourColumnName desc : 과거 날짜들은 내림차순으로 정렬되어 가장 최근의 과거 날짜가 그다음 순위가 됩니다.
  • limit 1 : 최종적으로 한 개의 행만 반환합니다.

예제 : 테이블 생성 및 데이터 입력

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable1454
    -> (
    -> ShippingDate date
    -> );
Query OK, 0 rows affected (0.59 sec)

insert 명령어를 사용해 테이블에 배송 날짜 데이터를 삽입합니다.

mysql> insert into DemoTable1454 values('2019-10-01');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable1454 values('2019-10-03');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable1454 values('2019-10-05');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable1454 values('2019-10-04');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1454 values('2018-10-06');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1454 values('2019-10-06');
Query OK, 1 row affected (0.11 sec)

select 문으로 테이블의 전체 레코드를 확인합니다.

mysql> select * from DemoTable1454;

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

+--------------+
| ShippingDate |
+--------------+
| 2019-10-01   |
| 2019-10-03   |
| 2019-10-05   |
| 2019-10-04   |
| 2018-10-06   |
| 2019-10-06   |
+--------------+
6 rows in set (0.00 sec)

현재 날짜 확인

now() 함수를 사용하면 현재 날짜와 시간을 확인할 수 있습니다.

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2019-10-04 21:30:01 |
+---------------------+
1 row in set (0.00 sec)

다음으로 가장 가까운 날짜를 구하는 쿼리

이제 두 날짜 사이에서 다음으로 가장 가까운 날짜를 조회하는 실제 쿼리입니다.

mysql> select * from DemoTable1454
    -> order by ( ShippingDate > now()) desc,
    ->     (case when ShippingDate > now() then ShippingDate  end) ,
    ->    ShippingDate  desc
    -> limit 1;

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

+--------------+
| ShippingDate |
+--------------+
| 2019-10-05   |
+--------------+
1 row in set (0.00 sec)

결과 분석

현재 날짜가 2019-10-04이므로, 미래 날짜 중 가장 가까운 것은 2019-10-05입니다. 쿼리가 정확히 2019-10-05를 반환한 것을 확인할 수 있습니다. 참고로 테이블에 미래 날짜가 하나도 없는 경우에는 가장 최근의 과거 날짜가 대신 반환됩니다. 이처럼 ORDER BY 절의 조건식과 CASE 표현식을 활용하면 별도의 서브쿼리 없이도 간단하게 원하는 날짜를 조회할 수 있습니다.