Vấn đề:
Bạn muốn sắp xếp các hàng theo ngày.
Ví dụ 1:
exam
bảng có hai cột, subject
và exam_date
.
chủ đề | exam_date |
---|---|
Toán học | ngày 12 tháng 12 năm 2019 |
Tiếng Anh | 2020-01-08 |
Khoa học | 2020-01-05 |
Sức khỏe | 2020-01-05 |
Nghệ thuật | KHÔNG ĐẦY ĐỦ |
Bạn muốn sắp xếp các hàng theo exam_date
.
Giải pháp:
SELECT * FROM exam ORDER BY exam_date;
Kết quả trông như thế này (các hàng được sắp xếp theo thứ tự tăng dần theo exam_date
):
chủ đề | exam_date |
---|---|
Toán học | ngày 12 tháng 12 năm 2019 |
Khoa học | 2020-01-05 |
Sức khỏe | 2020-01-05 |
Tiếng Anh | 2020-01-08 |
Nghệ thuật | KHÔNG ĐẦY ĐỦ |
Thảo luận:
Sử dụng ORDER BY
từ khóa và tên của cột mà bạn muốn sắp xếp. Bằng cách này, bạn sẽ sắp xếp dữ liệu theo thứ tự tăng dần của cột này. Bạn cũng có thể sử dụng ASC
từ khóa để làm rõ rằng thứ tự tăng dần (ngày sớm nhất được hiển thị trước, ngày mới nhất được hiển thị sau cùng, v.v.).
SELECT * FROM exam ORDER BY exam_date ASC;
Nếu bạn muốn xem ngày mới nhất trước và ngày sớm nhất sau cùng, bạn cần sắp xếp theo thứ tự giảm dần. Sử dụng DESC
từ khóa trong trường hợp này.
SELECT * FROM exam ORDER BY exam_date DESC;
Lưu ý rằng trong PostgreSQL và Oracle, NULL
s được hiển thị cuối cùng khi sắp xếp theo thứ tự tăng dần và đầu tiên khi sắp xếp theo thứ tự giảm dần. Ngoài ra, các hàng có cùng exam_date
được hiển thị theo thứ tự ngẫu nhiên (bạn có thể thấy Science
thứ hai và Health
thứ ba, hoặc Sức khỏe thứ hai và Science
thứ ba).
Ví dụ 2:
exam
bảng có các cột sau:subject
, exam_year
, exam_month
và exam_day
. Các tháng được viết bằng tên, không phải bằng số.
chủ đề | exam_year | exam_month | exam_day |
---|---|---|---|
Toán học | 2019 | Tháng 12 | 19 |
Tiếng Anh | 2020 | tháng 1 | 8 |
Khoa học | 2020 | tháng 1 | 5 |
Sức khỏe | 2020 | tháng 1 | 5 |
Nghệ thuật | KHÔNG ĐẦY ĐỦ | KHÔNG ĐẦY ĐỦ | KHÔNG ĐẦY ĐỦ |
Bạn muốn sắp xếp các hàng theo ngày thi.
Giải pháp:
SELECT * FROM exam ORDER BY exam_year, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')), exam_day;
Kết quả trông như thế này (các hàng được sắp xếp theo thứ tự tăng dần theo exam_year
, exam_month
và exam_date
):
chủ đề | exam_year | exam_month | exam_day |
---|---|---|---|
Toán học | 2019 | Tháng 12 | 19 |
Sức khỏe | 2020 | tháng 1 | 5 |
Khoa học | 2020 | tháng 1 | 5 |
Tiếng Anh | 2020 | tháng 1 | 8 |
Nghệ thuật | KHÔNG ĐẦY ĐỦ | KHÔNG ĐẦY ĐỦ | KHÔNG ĐẦY ĐỦ |
Thảo luận:
Bạn cần sắp xếp các hàng theo ba giá trị:năm, tháng và ngày, nhưng để có thứ tự chính xác, bạn cần chuyển đổi tháng thành một số ('January
'đến 1
, 'February
'đến 2
, vân vân.). Nếu không, bạn sẽ thấy 'December
'trước' January
'. Hàm TO_DATE (exam_month, 'Month') chuyển đổi tên tháng đầy đủ thành một ngày trong '0001-MM-01
' định dạng. Ví dụ:bạn nhận được '0001-12-01
'cho tháng 12.
Bây giờ bạn có thể sử dụng hàm EXTRACT (THÁNG TỪ ngày) để trích xuất tháng từ giá trị ngày này. Tháng sẽ được trả về dưới dạng một số.
Kết hợp hai hàm này, bạn có thể nhận được tháng dưới dạng số bằng công thức sau:
EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month'))
Để sắp xếp các hàng theo ngày, bạn cần sắp xếp theo năm, tháng và ngày (theo thứ tự này). Nếu bạn muốn xem bài kiểm tra mới nhất trước tiên, bạn cần sắp xếp theo thứ tự giảm dần. Để thực hiện việc này, bạn cần sử dụng DESC
từ khóa sau mỗi cột trong ORDER BY
mệnh đề.
SELECT * FROM exam ORDER BY exam_year DESC, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC, exam_day DESC;