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

MySQL에서 현재 날짜를 기준으로 날짜 데이터를 정렬하는 쿼리 작성 방법

날짜 데이터를 현재 날짜를 기준으로 정렬해야 하는 경우가 종종 있습니다. 예를 들어 마감일(DueDate) 목록에서 아직 지나지 않은 날짜를 먼저 보여주고, 이미 지난 날짜는 그 뒤에 표시하고 싶다면 ORDER BY 절과 CASE 문을 조합하면 간단하게 해결할 수 있습니다.

1. 테이블 생성하기

먼저 예제에 사용할 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
(
    DueDate date
);
Query OK, 0 rows affected (0.56 sec)

참고: 현재 날짜는 2019-07-22라고 가정합니다.

2. 샘플 데이터 삽입하기

insert 명령을 사용해 테이블에 여러 개의 날짜 레코드를 추가합니다.

mysql> insert into DemoTable values('2019-03-10');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2019-08-25');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('2019-06-01');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('2019-12-31');
Query OK, 1 row affected (0.17 sec)

3. 저장된 데이터 확인하기

select 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select *from DemoTable;

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

+------------+
| DueDate    |
+------------+
| 2019-03-10 |
| 2019-08-25 |
| 2019-06-01 |
| 2019-12-31 |
+------------+
4 rows in set (0.00 sec)

4. 현재 날짜 기준으로 정렬하는 쿼리

다음은 오늘 날짜 이후의 데이터를 먼저 출력하고, 이미 지난 날짜를 나중에 정렬하는 쿼리입니다.

mysql> select *from DemoTable order by case when DueDate > curdate() then 0 else 1 end, DueDate;

실행 결과:

+------------+
| DueDate    |
+------------+
| 2019-08-25 |
| 2019-12-31 |
| 2019-03-10 |
| 2019-06-01 |
+------------+
4 rows in set (0.00 sec)

쿼리 동작 원리

이 쿼리의 핵심은 case when DueDate > curdate() then 0 else 1 end 부분입니다.

  • 미래 날짜: 마감일(DueDate)이 현재 날짜(curdate())보다 크면 0을 반환합니다.
  • 과거 날짜: 그 외의 경우, 즉 이미 지난 날짜는 1을 반환합니다.

정렬 시 0이 1보다 앞에 오기 때문에, 아직 지나지 않은 날짜인 2019-08-25와 2019-12-31이 먼저 출력되고, 그 뒤에 이미 지난 날짜인 2019-03-10과 2019-06-01이 표시됩니다. 또한 각 그룹 내에서는 두 번째 정렬 조건인 DueDate를 기준으로 오름차순 정렬이 적용되어 날짜 순서대로 깔끔하게 정렬된 결과를 얻을 수 있습니다.