Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เรียงลำดับและแสดงความต่างวันที่จากวันปัจจุบันใน MySQL

บทนำ

การจัดเรียงวันที่ตามความใกล้เคียงกับวันปัจจุบัน พร้อมแสดงจำนวนวันที่ต่างกัน สามารถทำได้ด้วย 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)

คำอธิบายตรรกะการเรียง

  1. CASE WHEN DaysDiff < 0 THEN 1 ELSE 0 END - จัดกลุ่ม: วันที่อนาคต (0) ก่อน, วันที่ผ่านมา (1) หลัง
  2. DaysDiff - เรียงในแต่ละกลุ่มจากน้อยไปมาก (วันที่ใกล้ที่สุดก่อน)

ผลลัพธ์ที่ได้

  • วันที่อนาคต: เรียงจากใกล้วันนี้ที่สุด → ไกลที่สุด (1, 2, 3 วัน)
  • วันที่ผ่านมา: เรียงจากใกล้วันนี้ที่สุด → ไกลที่สุด (-4, -8 วัน)

เหมาะสำหรับระบบ Task Management, Due Date Tracking, Notification Scheduling