Problem:
Sie möchten die Zeilen nach Monatsnummer und gegebenen Monatsnamen sortieren (Januar soll zuerst angezeigt werden, Dezember zuletzt).
Beispiel:
Der birthday
Tabelle enthält zwei Spalten:name und birthday_month
. Die Monate werden in Namen angegeben, nicht in Zahlen.p>
name | Geburtstagsmonat |
---|---|
Ronan Tisha | NULL |
Dezember | 2020 |
Angie Julia | April |
Narelle Dillan | April |
Purdie Casey | Januar |
Donna Nell | NULL |
Blaze Graeme | Oktober |
Sie möchten die Zeilen nach birthday_month
sortieren .
Lösung:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Das Ergebnis sieht so aus:
name | Geburtstagsmonat |
---|---|
Donna Nell | NULL |
Purdie Casey | Januar |
Angie Julia | April |
Narelle Dillan | April |
Blaze Graeme | Oktober |
Ronan Tisha | NULL |
Dezember | Oktober |
Diskussion:
Um nach Monat zu sortieren, erstellen Sie ein Datum mit diesem Monat. Verwenden Sie dazu die Funktion STR_TO_DATE(). Wenn Sie ein Datum als Zeichenfolge in „Year Month Day
gespeichert haben ' formatieren, können Sie es mit STR_TO_DATE(date_string, '%Y %M %d')
in ein Datum umwandeln .
Zuerst müssen Sie mit der Funktion CONCAT() einen String erstellen. Das Jahr kann ein beliebiges Jahr sein (z. B. 0001
) und der Tag kann ein beliebiger Tag sein (z. B. 01
):
CONCAT('0001 ', birthday_month, ' 01')
Der CONCAT()
Die Funktion kombiniert alle Argumente zu einem String. Die Zeichenfolge sollte im 'Year Month Day
stehen ' Format, also sollte das zweite Argument birthday_month
sein; das erste und das dritte Argument müssen nur im richtigen Format vorliegen.
Anschließend müssen Sie diese Zeichenfolge mithilfe von STR_TO_DATE(date_string, '%Y %M %d')
in ein Datum umwandeln Funktion. Das zweite Argument dieser Funktion ist das Datumsformat. %Y
steht für Jahr, %M
steht für Monat (sein vollständiger Name, keine Zahl) und %d
steht für Tag.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Verwenden Sie es mit einem ORDER BY
-Klausel, um die Zeilen in aufsteigender Reihenfolge nach Datum zu sortieren. Wenn Sie die Zeilen in absteigender Reihenfolge sehen möchten, hängen Sie einfach ein DESC
an Schlüsselwort, etwa so:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Beachten Sie, dass in MySQL NULL
s werden bei aufsteigender Sortierung zuerst und bei absteigender Sortierung zuletzt angezeigt. Auch die Zeilen mit demselben birthday_month
werden in zufälliger Reihenfolge angezeigt (möglicherweise sehen Sie Angie Julia
dritte und Narelle Dillan
viertens oder Narelle Dillan
dritte und Angie Julia
vierte).