การเรียงลำดับ (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;