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

เรียงลำดับวันที่และเวลาลำดับถอยหลังใน MySQL (DESC)

การเรียงลำดับ (Sort) ตามวันที่และเวลาใน MySQL ใช้ ORDER BY ... DESC สำหรับลำดับถอยหลัง (ใหม่สุดก่อน)

ตัวอย่าง: ตารางมี Date และ Time แยกคอลัมน์

1. สร้างตารางและเพิ่มข้อมูล

mysql> CREATE TABLE SortByDateAndTime (
    -> UserId INT,
    -> UserName VARCHAR(100),
    -> IssueDate DATE,
    -> IssueTime TIME
    -> );
Query OK, 0 rows affected (0.60 sec)

mysql> INSERT INTO SortByDateAndTime VALUES 
    -> (1, 'John', '2018-12-16', '10:30'),
    -> (2, 'Bob', '2018-12-16', '10:10'),
    -> (3, 'Carol', '2018-12-16', '10:20'),
    -> (4, 'Sam', '2018-12-16', '10:00');

2. ดูข้อมูลดิบ (ไม่ได้เรียง)

mysql> SELECT * FROM SortByDateAndTime;
+--------+----------+------------+-----------+
| UserId | UserName | IssueDate  | IssueTime |
+--------+----------+------------+-----------+
| 1      | John     | 2018-12-16 | 10:30:00  |
| 2      | Bob      | 2018-12-16 | 10:10:00  |
| 3      | Carol    | 2018-12-16 | 10:20:00  |
| 4      | Sam      | 2018-12-16 | 10:00:00  |
+--------+----------+------------+-----------+
4 rows in set (0.00 sec)

3. เรียงวันที่ DESC, เวลา DESC (ใหม่สุดก่อน, เวลาสายก่อน)

mysql> SELECT UserId, UserName, DATE(IssueDate) AS date1, IssueTime 
    -> FROM SortByDateAndTime 
    -> ORDER BY DATE(IssueDate) DESC, IssueTime DESC;
+--------+----------+------------+-----------+
| UserId | UserName | date1      | IssueTime |
+--------+----------+------------+-----------+
| 1      | John     | 2018-12-16 | 10:30:00  |
| 3      | Carol    | 2018-12-16 | 10:20:00  |
| 2      | Bob      | 2018-12-16 | 10:10:00  |
| 4      | Sam      | 2018-12-16 | 10:00:00  |
+--------+----------+------------+-----------+
4 rows in set (0.00 sec)

4. เรียงวันที่ DESC, เวลา ASC (ใหม่สุดก่อน, เวลาก่อนก่อน)

mysql> SELECT UserId, UserName, DATE(IssueDate) AS date1, IssueTime 
    -> FROM SortByDateAndTime 
    -> ORDER BY DATE(IssueDate) DESC, IssueTime ASC;
+--------+----------+------------+-----------+
| UserId | UserName | date1      | IssueTime |
+--------+----------+------------+-----------+
| 4      | Sam      | 2018-12-16 | 10:00:00  |
| 2      | Bob      | 2018-12-16 | 10:10:00  |
| 3      | Carol    | 2018-12-16 | 10:20:00  |
| 1      | John     | 2018-12-16 | 10:30:00  |
+--------+----------+------------+-----------+
4 rows in set (0.00 sec)

รูปแบบ ORDER BY ทั่วไป

ความต้องการORDER BY Clause
วันที่ใหม่สุดก่อน, เวลาใหม่สุดก่อนORDER BY date_col DESC, time_col DESC
วันที่ใหม่สุดก่อน, เวลาเก่าสุดก่อนORDER BY date_col DESC, time_col ASC
วันที่เก่าสุดก่อน, เวลาใหม่สุดก่อนORDER BY date_col ASC, time_col DESC
วันที่เก่าสุดก่อน, เวลาเก่าสุดก่อนORDER BY date_col ASC, time_col ASC
DATETIME เดียว (รวมวันที่+เวลา)ORDER BY datetime_col DESC

ใช้กับ DATETIME / TIMESTAMP เดียว

-- เรียงเวลาล่าสุดก่อน (Common pattern)
SELECT * FROM logs ORDER BY created_at DESC LIMIT 100;

-- เรียงเวลาก่อนหน้าก่อน
SELECT * FROM events ORDER BY event_time ASC;

Performance Tips

  • สร้าง Index บนคอลัมน์ที่ ORDER BY: INDEX idx_date_time (IssueDate, IssueTime)
  • หาก WHERE และ ORDER BY ตรงกัน จะใช้ Index ได้เต็มที่
  • LIMIT ร่วมกับ ORDER BY ช่วยหยุด Scan ทั้งตาราง
  • หลีกเลี่ยง Function บนคอลัมน์ใน ORDER BY (เช่น ORDER BY DATE(ts) DESC) → ใช้ Generated Column หรือเก็บ Date แยก

Generated Column สำหรับ Sort (MySQL 5.7+)

ALTER TABLE SortByDateAndTime 
ADD COLUMN dt DATETIME GENERATED ALWAYS AS (CONCAT(IssueDate, ' ', IssueTime)) STORED,
ADD INDEX idx_dt (dt);

-- ใช้งาน
SELECT * FROM SortByDateAndTime ORDER BY dt DESC;