Problem:
Chcesz posortować wiersze według daty.
Przykład 1:
exam
tabela ma dwie kolumny, subject
i exam_date
.
temat | data_egzaminu |
---|---|
Matematyka | 2019-12-19 |
angielski | 2020-01-08 |
Nauka | 2020-01-05 |
Zdrowie | 2020-01-05 |
Sztuka | NULL |
Chcesz posortować wiersze według exam_date
.
Rozwiązanie:
SELECT * FROM exam ORDER BY exam_date;
Wynik wygląda tak (wiersze są sortowane w porządku rosnącym według exam_date
):
temat | data_egzaminu |
---|---|
Matematyka | 2019-12-19 |
Nauka | 2020-01-05 |
Zdrowie | 2020-01-05 |
angielski | 2020-01-08 |
Sztuka | NULL |
Dyskusja:
Użyj ORDER BY
słowo kluczowe i nazwę kolumny, według której chcesz sortować. W ten sposób posortujesz dane w kolejności rosnącej według tej kolumny. Możesz także użyć ASC
słowo kluczowe, aby było jasne, że kolejność rośnie (najwcześniejsza data jest wyświetlana jako pierwsza, najnowsza data jest wyświetlana jako ostatnia itd.).
SELECT * FROM exam ORDER BY exam_date ASC;
Jeśli chcesz zobaczyć najnowszą datę jako pierwszą, a najwcześniejszą jako ostatnią, musisz posortować dane w kolejności malejącej. Użyj DESC
w tym przypadku słowo kluczowe.
SELECT * FROM exam ORDER BY exam_date DESC;
Zauważ, że w PostgreSQL i Oracle NULL
s są wyświetlane jako ostatnie przy sortowaniu w porządku rosnącym i jako pierwsze przy sortowaniu w porządku malejącym. Ponadto wiersze z tą samą exam_date
są wyświetlane w losowej kolejności (możesz zobaczyć Science
drugi i Health
po trzecie lub Zdrowie po drugie i Science
trzeci).
Przykład 2:
exam
tabela ma następujące kolumny:subject
, exam_year
, exam_month
i exam_day
. Miesiące podane są w imionach, a nie w liczbach.
temat | rok_egzaminacyjny | egzamin_miesiąc | dzień_egzaminacyjny |
---|---|---|---|
Matematyka | 2019 | grudzień | 19 |
angielski | 2020 | Styczeń | 8 |
Nauka | 2020 | Styczeń | 5 |
Zdrowie | 2020 | Styczeń | 5 |
Sztuka | NULL | NULL | NULL |
Chcesz posortować wiersze według daty egzaminu.
Rozwiązanie:
SELECT * FROM exam ORDER BY exam_year, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')), exam_day;
Wynik wygląda tak (wiersze są sortowane rosnąco według exam_year
, exam_month
i exam_date
):
temat | rok_egzaminacyjny | egzamin_miesiąc | dzień_egzaminacyjny |
---|---|---|---|
Matematyka | 2019 | grudzień | 19 |
Zdrowie | 2020 | Styczeń | 5 |
Nauka | 2020 | Styczeń | 5 |
angielski | 2020 | Styczeń | 8 |
Sztuka | NULL | NULL | NULL |
Dyskusja:
Musisz uporządkować wiersze według trzech wartości:roku, miesiąca i dnia, ale aby uzyskać prawidłową kolejność, musisz przekonwertować miesiąc na liczbę ('January
' do 1
, 'February
' do 2
itp.). W przeciwnym razie zobaczysz „December
' przed 'January
„. Funkcja TO_DATE(exam_month, 'Month') konwertuje pełną nazwę miesiąca na datę w '0001-MM-01
format. Na przykład otrzymasz „0001-12-01
' na grudzień.
Możesz teraz użyć funkcji EXTRACT(MIESIĄC OD daty), aby wyodrębnić miesiąc z tej wartości daty. Miesiąc zostanie zwrócony jako liczba.
Łącząc te dwie funkcje, możesz otrzymać miesiąc jako liczbę za pomocą następującego wzoru:
EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month'))
Aby posortować wiersze według daty, musisz posortować według roku, miesiąca i dnia (w tej kolejności). Jeśli chcesz najpierw zobaczyć najnowszy egzamin, posortuj dane w kolejności malejącej. Aby to zrobić, musisz użyć DESC
słowo kluczowe po każdej kolumnie w ORDER BY
klauzula.
SELECT * FROM exam ORDER BY exam_year DESC, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC, exam_day DESC;