บทนำ
การจัดเรียงวันที่ตามความใกล้เคียงกับวันปัจจุบัน พร้อมแสดงจำนวนวันที่ต่างกัน สามารถทำได้ด้วย DATEDIFF() และ ORDER BY แบบกำหนดเอง
วันที่ปัจจุบัน (สมมติ)
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2019-06-09 21:08:16 |
+---------------------+
ตัวอย่างการสร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> DueDate DATETIME
-> );
Query OK, 0 rows affected (0.62 sec)
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-12');
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-01');
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-05');
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-10');
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-11');
แสดงข้อมูลทั้งหมด
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)
คำสั่งเรียงลำดับพร้อมแสดงความต่างวัน
mysql> SELECT Id, DueDate,
-> DATEDIFF(DueDate, CURDATE()) AS DaysDiff
-> FROM DemoTable
-> ORDER BY CASE WHEN DaysDiff < 0 THEN 1 ELSE 0 END, DaysDiff;
ผลลัพธ์
+----+---------------------+----------+
| Id | DueDate | DaysDiff |
+----+---------------------+----------+
| 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)
คำอธิบายตรรกะการเรียง
CASE WHEN DaysDiff < 0 THEN 1 ELSE 0 END- จัดกลุ่ม: วันที่อนาคต (0) ก่อน, วันที่ผ่านมา (1) หลังDaysDiff- เรียงในแต่ละกลุ่มจากน้อยไปมาก (วันที่ใกล้ที่สุดก่อน)
ผลลัพธ์ที่ได้
- วันที่อนาคต: เรียงจากใกล้วันนี้ที่สุด → ไกลที่สุด (1, 2, 3 วัน)
- วันที่ผ่านมา: เรียงจากใกล้วันนี้ที่สุด → ไกลที่สุด (-4, -8 วัน)
เหมาะสำหรับระบบ Task Management, Due Date Tracking, Notification Scheduling