Problem:
Chcesz posortować wiersze według numeru miesiąca, podanych nazw miesięcy (chcesz, aby styczeń był wyświetlany jako pierwszy, grudzień jako ostatni).
Przykład:
birthday
tabela zawiera dwie kolumny:imię i nazwisko oraz birthday_month
. Miesiące podane są w imionach, a nie w liczbach.p>
name | birthday_month |
---|---|
Ronan Tisha | NULL |
Grudzień | 2020 |
Angie Julia | Kwiecień |
Narelle Dillan | Kwiecień |
Purdie Casey | Styczeń |
Donna Nell | NULL |
Blaze Graeme | październik |
Chcesz posortować wiersze według birthday_month
.
Rozwiązanie:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Wynik wygląda tak:
nazwa | birthday_month |
---|---|
Donna Nell | NULL |
Purdie Casey | Styczeń |
Angie Julia | Kwiecień |
Narelle Dillan | Kwiecień |
Blaze Graeme | październik |
Ronan Tisza | NULL |
Grudzień | październik |
Dyskusja:
Aby zamówić według miesiąca, utwórz datę z tym miesiącem. Aby to zrobić, użyj funkcji STR_TO_DATE(). Jeśli masz datę zapisaną jako ciąg w 'Year Month Day
', możesz rzutować go na datę za pomocą STR_TO_DATE(date_string, '%Y %M %d')
.
Najpierw musisz utworzyć ciąg znaków za pomocą funkcji CONCAT(). Rok może być dowolnym rokiem (np. 0001
), a dzień może być dowolnym dniem (np. 01
):
CONCAT('0001 ', birthday_month, ' 01')
CONCAT()
funkcja łączy wszystkie argumenty w jeden ciąg. Ciąg powinien znajdować się w 'Year Month Day
', więc drugim argumentem powinien być birthday_month
; pierwszy i trzeci argument muszą być po prostu w poprawnym formacie.
Następnie musisz przekonwertować ten ciąg na datę za pomocą STR_TO_DATE(date_string, '%Y %M %d')
funkcjonować. Drugim argumentem tej funkcji jest format daty. %Y
oznacza rok, %M
oznacza miesiąc (pełna nazwa, a nie numer) i %d
oznacza dzień.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Użyj go z ORDER BY
klauzula sortowania wierszy w porządku rosnącym według daty. Jeśli chcesz zobaczyć wiersze w kolejności malejącej, po prostu dołącz DESC
słowo kluczowe, takie jak to:
SELECT * FROM birthday ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Zauważ, że w MySQL NULL
s są wyświetlane jako pierwsze przy sortowaniu w porządku rosnącym i jako ostatnie przy sortowaniu w porządku malejącym. Ponadto wiersze z tym samym birthday_month
są wyświetlane w losowej kolejności (możesz zobaczyć Angie Julia
trzeci i Narelle Dillan
czwarty lub Narelle Dillan
trzecia i Angie Julia
czwarty).