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 ExamDate;
Wynik wygląda tak (wiersze są sortowane w porządku rosnącym według ExamDate ):
| Temat | Data egzaminu |
|---|---|
| Sztuka | NULL |
| Nauka | 2020-01-05 |
| Zdrowie | 2020-01-05 |
| angielski | 2020-01-08 |
| Matematyka | 2019-12-19 |
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 ExamDate ASC;
Jeśli chcesz, aby najnowsza data była widoczna jako pierwsza, a najwcześniejsza jako ostatnia, musisz posortować dane w kolejności malejącej. Użyj DESC w tym przypadku słowo kluczowe.
SELECT * FROM Exam ORDER BY ExamDate DESC;
Zauważ, że w T-SQL 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 ExamDate są wyświetlane w niedeterministycznej kolejności (możesz zobaczyć Science drugi i Health trzeci lub Health drugi i Science trzeci).
Przykład 2:
exam tabela ma następujące kolumny:subject , exam_year , exam_month i exam_day . Miesiąc jest podawany według nazwy, a nie numeru.
| Temat | Rok egzaminu | Miesiąc egzaminu | Dzień egzaminu |
|---|---|---|---|
| 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 CAST( CAST(ExamYear AS VARCHAR(4)) + '-' + ExamMonth + '-' + CAST(ExamDay AS VARCHAR(2)) AS DATE);
Wynik wygląda tak (wiersze są sortowane rosnąco według ExamYear , ExamMonth i ExamDate ):
| Temat | Rok egzaminu | Miesiąc egzaminu | Dzień egzaminu |
|---|---|---|---|
| Sztuka | NULL | NULL | NULL |
| Zdrowie | 2020 | Styczeń | 5 |
| Nauka | 2020 | Styczeń | 5 |
| angielski | 2020 | Styczeń | 8 |
| Matematyka | 2019 | grudzień | 19 |
Dyskusja:
Aby pogrupować według daty, utwórz wartości dat na podstawie wartości roku, miesiąca i dnia. Aby to zrobić, użyj funkcji CAST(). Jeśli masz datę zapisaną jako ciąg w 'YYYY-Month-DD ', możesz rzutować go na datę za pomocą CAST(date_string AS date) . Najpierw musisz utworzyć ciąg znaków, również za pomocą funkcji CAST():
CAST(ExamYear AS VARCHAR(4)) + '-' + ExamMonth + '-' + CAST(ExamDay AS VARCHAR(2))
Wyrażenie CAST(ExamYear AS VARCHAR(4)) tworzy ciąg z liczby przechowywanej w ExamYear . Wyrażenie CAST(ExamDay AS VARCHAR(2)) tworzy ciąg z liczby przechowywanej w ExamDay . ExamMonth jest już ciągiem, więc nie ma potrzeby go rzucać.
Następnie musisz rzutować ten ciąg na datę za pomocą CAST(date_string AS date) funkcja:
CAST( CAST(ExamYear AS VARCHAR(4)) + '-' + ExamMonth + '-' + CAST(ExamDay AS VARCHAR(2)) AS DATE)
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 Exam ORDER BY CAST( CAST(ExamYear AS VARCHAR(4)) + '-' + ExamMonth + '-' + CAST(ExamDay AS VARCHAR(2)) AS DATE) DESC;