sql >> Databasteknik >  >> RDS >> Database

Hur man beställer efter datum i T-SQL

Problem:

Du vill sortera raderna efter datum.

Exempel 1:

exam Tabellen har två kolumner, subject och exam_date .

Ämne ExamDate
Matematik 2019-12-19
Engelska 2020-01-08
Vetenskap 2020-01-05
Hälsa 2020-01-05
Konst NULL

Du vill sortera raderna efter exam_date .

Lösning:

SELECT *
FROM Exam
ORDER BY ExamDate;

Resultatet ser ut så här (raderna är sorterade i stigande ordning efter ExamDate ):

Ämne ExamDate
Konst NULL
Vetenskap 2020-01-05
Hälsa 2020-01-05
Engelska 2020-01-08
Matematik 2019-12-19

Diskussion:

Använd ORDER BY nyckelord och namnet på den kolumn som du vill sortera efter. På så sätt kommer du att sortera data i stigande ordning efter den här kolumnen. Du kan också använda ASC nyckelord för att göra det tydligt att ordningen stiger (det tidigaste datumet visas först, det senaste datumet visas sist, etc.).

SELECT *
FROM Exam
ORDER BY ExamDate ASC;

Om du vill se det senaste datumet först och det tidigaste datumet sist måste du sortera i fallande ordning. Använd DESC nyckelord i det här fallet.

SELECT *
FROM Exam
ORDER BY ExamDate DESC;

Observera att i T-SQL, NULL s visas först vid sortering i stigande ordning och sist vid sortering i fallande ordning. Dessutom raderna med samma ExamDate visas i icke-deterministisk ordning (du kan se Science andra och Health tredje, eller Health andra och Science tredje).

Exempel 2:

exam Tabellen har följande kolumner:subject , exam_year , exam_month och exam_day . Månaden anges med namn, inte med nummer.

Ämne Examenår Examenmånad Examendagen
Matematik 2019 December 19
Engelska 2020 Januari 8
Vetenskap 2020 Januari 5
Hälsa 2020 Januari 5
Konst NULL NULL NULL

Du vill sortera raderna efter undersökningsdatum.

Lösning:

SELECT *
FROM Exam
ORDER BY CAST(
  CAST(ExamYear AS VARCHAR(4))
  + '-'
  + ExamMonth
  + '-'
  + CAST(ExamDay AS VARCHAR(2))
AS DATE);

Resultatet ser ut så här (raderna är sorterade i stigande ordning efter ExamYear , ExamMonth och ExamDate ):

Ämne Examenår Examenmånad Examendagen
Konst NULL NULL NULL
Hälsa 2020 Januari 5
Vetenskap 2020 Januari 5
Engelska 2020 Januari 8
Matematik 2019 December 19

Diskussion:

För att gruppera efter datum, skapa datumvärden från år, månad och dagvärden. Använd funktionen CAST() för att göra detta. Om du har ett datum lagrat som en sträng i 'YYYY-Month-DD ' format, kan du casta det till ett datum med CAST(date_string AS date) . Först måste du skapa en sträng, även med funktionen CAST():

CAST(ExamYear AS VARCHAR(4))
+ '-'
+ ExamMonth
+ '-'
+ CAST(ExamDay AS VARCHAR(2))

Uttrycket CAST(ExamYear AS VARCHAR(4)) skapar en sträng från numret som är lagrat i ExamYear . Uttrycket CAST(ExamDay AS VARCHAR(2)) skapar en sträng från numret som är lagrat i ExamDay . ExamMonth är redan en sträng, så det finns ingen anledning att kasta den.

Sedan måste du casta den här strängen till ett datum med CAST(date_string AS date) funktion:

CAST(
  CAST(ExamYear AS VARCHAR(4))
  + '-'
  + ExamMonth
  + '-'
  + CAST(ExamDay AS VARCHAR(2))
AS DATE)

Använd den med en ORDER BY sats för att sortera raderna i stigande ordning efter datum. Om du vill se raderna i fallande ordning, lägg bara till en DESC nyckelord, så här:

SELECT *
FROM Exam
ORDER BY CAST(
  CAST(ExamYear AS VARCHAR(4))
  + '-'
  + ExamMonth
  + '-'
  + CAST(ExamDay AS VARCHAR(2))
AS DATE) DESC;

  1. Postgres och index på främmande nycklar och primärnycklar

  2. Hur INTERSECT fungerar i PostgreSQL

  3. Oracle:funktionsbaserad indexselektiv unikhet

  4. Ersätt flera tecken i en sträng i SQL Server (T-SQL)