sql >> Databasteknik >  >> RDS >> Oracle

Hur man beställer efter datum i PostgreSQL eller Oracle

Problem:

Du vill sortera raderna efter datum.

Exempel 1:

exam Tabellen har två kolumner, subject och exam_date .

ämne exam_date
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 exam_date;

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

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

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 exam_date 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 exam_date DESC;

Observera att i PostgreSQL och i Oracle, NULL s visas sist vid sortering i stigande ordning och först vid sortering i fallande ordning. Dessutom raderna med samma exam_date visas i slumpmässig ordning (du kan se Science andra och Health tredje, eller hälsa andra och Science tredje).

Exempel 2:

exam Tabellen har följande kolumner:subject , exam_year , exam_month och exam_day . Månaderna anges i namn, inte i siffror.

ämne examensår exam_month exam_day
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 examensdatum.

Lösning:

SELECT *
FROM exam
ORDER BY
  exam_year,
  EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')),
  exam_day;

Resultatet ser ut så här (raderna är sorterade i stigande ordning efter exam_year , exam_month och exam_date ):

ämne examensår exam_month exam_day
Matematik 2019 December 19
Hälsa 2020 Januari 5
Vetenskap 2020 Januari 5
Engelska 2020 Januari 8
Konst NULL NULL NULL

Diskussion:

Du måste ordna raderna efter tre värden:året, månaden och dagen, men för att ha rätt ordning måste du konvertera månaden till ett tal ('January ' till 1 , 'February ' till 2 , etc.). Annars skulle du se 'December ' före 'January '. Funktionen TO_DATE(exam_month, 'Month') konverterar hela månadens namn till ett datum i '0001-MM-01 ' format. Till exempel får du '0001-12-01 ' för december.

Du kan nu använda EXTRACT(MONTH FROM date)-funktionen för att extrahera månaden från detta datumvärde. Månaden kommer att returneras som ett nummer.

Genom att kombinera dessa två funktioner kan du få månaden som ett tal med följande formel:

EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month'))

För att sortera raderna efter datum måste du sortera efter år, månad och dag (i denna ordning). Om du vill se det senaste provet först måste du sortera i fallande ordning. För att göra detta måste du använda en DESC nyckelord efter varje kolumn i ORDER BY klausul.

SELECT *
FROM exam
ORDER BY
  exam_year DESC,
  EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC,
  exam_day DESC;

  1. oracle SQL hur man tar bort tid från datum

  2. Vad är skillnaden mellan bindningsvariabler och substitutionsvariabler (som jag matar in med &&)?

  3. Hur man får första posten i varje grupp i MySQL

  4. Hur man väljer alla kolumner och ett antal(*) i samma fråga