Masalah:
Anda ingin mengurutkan baris menurut nomor bulan, nama bulan yang diberikan (Anda ingin Januari ditampilkan terlebih dahulu, Desember terakhir).
Contoh:
birthday
tabel berisi dua kolom:nama dan birthday_month
. Bulan ditulis dengan nama, bukan angka.p>
nama | bulan_ulang tahun |
---|---|
Ronan Tisha | NULL |
Desember | 2020 |
Angie Julia | April |
Narelle Dillan | April |
Purdie Casey | Januari |
Donna Nell | NULL |
Blaze Graeme | Oktober |
Anda ingin mengurutkan baris berdasarkan birthday_month
.
Solusi:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Hasilnya terlihat seperti ini:
nama | bulan_ulang tahun |
---|---|
Donna Nell | NULL |
Purdie Casey | Januari |
Angie Julia | April |
Narelle Dillan | April |
Blaze Graeme | Oktober |
Ronan Tisha | NULL |
Desember | Oktober |
Diskusi:
Untuk memesan berdasarkan bulan, buat tanggal dengan bulan ini. Untuk melakukannya, gunakan fungsi STR_TO_DATE(). Jika Anda memiliki tanggal yang disimpan sebagai string di 'Year Month Day
', Anda dapat memasukkannya ke tanggal menggunakan STR_TO_DATE(date_string, '%Y %M %d')
.
Pertama, Anda perlu membuat string menggunakan fungsi CONCAT(). Tahun dapat berupa tahun apa pun yang Anda inginkan (mis., 0001
) dan hari dapat berupa hari apa pun yang Anda inginkan (mis., 01
):
CONCAT('0001 ', birthday_month, ' 01')
CONCAT()
fungsi menggabungkan semua argumen menjadi satu string. String harus dalam 'Year Month Day
', jadi argumen kedua harus birthday_month
; argumen pertama dan ketiga hanya perlu dalam format yang benar.
Kemudian, Anda perlu mengubah string ini menjadi tanggal menggunakan STR_TO_DATE(date_string, '%Y %M %d')
fungsi. Argumen kedua dari fungsi ini adalah format tanggal. %Y
singkatan dari tahun, %M
singkatan dari bulan (nama lengkapnya, bukan angka), dan %d
singkatan dari hari.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Gunakan dengan ORDER BY
klausa untuk mengurutkan baris dalam urutan menaik berdasarkan tanggal. Jika Anda ingin melihat baris dalam urutan menurun, cukup tambahkan DESC
kata kunci, seperti ini:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Perhatikan bahwa di MySQL, NULL
s ditampilkan pertama kali saat mengurutkan dalam urutan menaik dan terakhir saat mengurutkan dalam urutan menurun. Juga, baris dengan birthday_month
yang sama ditampilkan dalam urutan acak (Anda dapat melihat Angie Julia
ketiga dan Narelle Dillan
keempat, atau Narelle Dillan
ketiga dan Angie Julia
keempat).