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

MySQL에서 현재 날짜와의 차이를 기준으로 날짜 정렬 및 표시하기

저장된 날짜(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로 변경하면 됩니다.