저장된 날짜(DueDate)를 현재 날짜와의 차이를 기준으로 정렬하고, 그 차이 값을 함께 표시하려면 ORDER BY 절과 DATEDIFF() 함수를 활용하면 됩니다. 먼저 현재 날짜를 확인해 보겠습니다.
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2019-06-09 21:08:16 | +---------------------+ 1 row in set (0.00 sec)
1. 테이블 생성
예제에 사용할 테이블을 먼저 생성합니다.
mysql> create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> DueDate datetime -> ); Query OK, 0 rows affected (0.62 sec)
2. 데이터 삽입
INSERT 명령을 사용하여 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable(DueDate) values('2019-06-12');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable(DueDate) values('2019-06-01');
Query OK, 1 row affected (0.37 sec)
mysql> insert into DemoTable(DueDate) values('2019-06-05');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(DueDate) values('2019-06-10');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(DueDate) values('2019-06-11');
Query OK, 1 row affected (0.66 sec)3. 전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
출력 결과
+----+---------------------+ | Id | DueDate | +----+---------------------+ | 1 | 2019-06-12 00:00:00 | | 2 | 2019-06-01 00:00:00 | | 3 | 2019-06-05 00:00:00 | | 4 | 2019-06-10 00:00:00 | | 5 | 2019-06-11 00:00:00 | +----+---------------------+ 5 rows in set (0.00 sec)
4. 날짜 차이 계산 및 정렬 쿼리
이제 핵심 쿼리입니다. DATEDIFF() 함수로 각 날짜와 현재 날짜(CURDATE())의 차이를 계산하고, 이를 별도의 컬럼으로 표시한 뒤 정렬합니다.
정렬 조건은 다음과 같습니다. 미래 날짜(차이가 0 이상인 값)를 먼저 오름차순으로 배치하고, 과거 날짜(음수 값)는 그 뒤에 배치합니다. 이를 위해 CASE WHEN 표현식을 사용합니다.
mysql> select Id,DueDate,DATEDIFF(DueDate, CURDATE()) AS t from DemoTable -> order by CASE WHEN t < 0 THEN 1 ELSE 0 END, t;
출력 결과
+----+---------------------+------+ | Id | DueDate | t | +----+---------------------+------+ | 4 | 2019-06-10 00:00:00 | 1 | | 5 | 2019-06-11 00:00:00 | 2 | | 1 | 2019-06-12 00:00:00 | 3 | | 2 | 2019-06-01 00:00:00 | -8 | | 3 | 2019-06-05 00:00:00 | -4 | +----+---------------------+------+ 5 rows in set (0.00 sec)
결과 해석
위 결과를 보면 다음과 같은 특징을 확인할 수 있습니다.
t >= 0(미래 또는 오늘 날짜)인 레코드가 먼저 출력되고, 차이 값이 작은 순서대로 정렬됩니다. 즉, 마감일이 가장 가까운 항목부터 표시됩니다. 그다음 t < 0(과거 날짜)인 레코드가 뒤따르며, 역시 차이 값 기준으로 정렬됩니다.
이러한 방식은 할 일 목록이나 마감 일정 관리처럼 다가오는 일정을 우선적으로 확인해야 하는 경우에 매우 유용합니다. 만약 과거 날짜를 먼저 표시하고 싶다면 CASE WHEN 조건의 THEN/ELSE 값을 반대로 바꾸거나 정렬 방향을 DESC로 변경하면 됩니다.