MySQL에서 타임스탬프 데이터를 내림차순(DESC)으로 정렬하면 일반적으로 최신 날짜가 맨 앞에 오게 됩니다. 하지만 0000-00-00 00:00:00과 같은 0(zero) 타임스탬프 값이 포함된 경우, 이를 가장 먼저 표시하고 싶을 때가 있습니다. 이 글에서는 ORDER BY 절을 활용해 0 타임스탬프를 우선적으로 배치하면서 나머지 데이터를 내림차순으로 정렬하는 방법을 알아보겠습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable ( `timestamp` timestamp ); Query OK, 0 rows affected (1.12 sec)
2. 레코드 삽입
INSERT 명령을 사용하여 몇 개의 레코드를 삽입합니다. 여기에는 의도적으로 0 타임스탬프 값도 함께 넣습니다.
mysql> insert into DemoTable values(now());
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values('00:00:00');
Query OK, 1 row affected (0.73 sec)
mysql> insert into DemoTable values('2018-01-10 12:34:45');
Query OK, 1 row affected (0.80 sec)
mysql> insert into DemoTable values('2019-12-31 10:50:45');
Query OK, 1 row affected (0.84 sec)3. 저장된 데이터 확인
SELECT 문을 사용하여 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+---------------------+ | timestamp | +---------------------+ | 2019-08-17 06:17:12 | | 0000-00-00 00:00:00 | | 2018-01-10 12:34:45 | | 2019-12-31 10:50:45 | +---------------------+ 4 rows in set (0.00 sec)
4. 0 타임스탬프를 먼저 표시하며 내림차순 정렬하기
핵심은 ORDER BY 절에서 두 개의 정렬 기준을 사용하는 것입니다. 첫 번째 기준인 (`timestamp`=0)은 해당 행의 타임스탬프가 0이면 1, 아니면 0을 반환하는 불리언 표현식입니다. 이를 DESC로 정렬하면 0 타임스탬프를 가진 행이 항상 맨 앞에 위치하게 되고, 두 번째 기준인 `timestamp` DESC가 나머지 행들을 최신 날짜 순으로 정렬합니다.
mysql> select *from DemoTable order by (`timestamp`=0) DESC,`timestamp` DESC;
실행 결과는 다음과 같습니다.
+---------------------+ | timestamp | +---------------------+ | 0000-00-00 00:00:00 | | 2019-12-31 10:50:45 | | 2019-08-17 06:17:12 | | 2018-01-10 12:34:45 | +---------------------+ 4 rows in set (0.00 sec)
정리
위 출력 결과를 보면 0000-00-00 00:00:00 값이 가장 먼저 표시되고, 그 뒤로 실제 날짜들이 최신순(내림차순)으로 정렬된 것을 확인할 수 있습니다. 이처럼 ORDER BY (`컬럼명`=0) DESC, `컬럼명` DESC 패턴을 활용하면 특수한 0 값을 우선 처리하면서 원하는 정렬 순서를 손쉽게 구현할 수 있습니다.