sql >> Databasteknik >  >> RDS >> SQLite

Hur man beställer efter datum i SQLite

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 ExamDate
Konst NULL
Matematik 2019-12-19
Vetenskap 2020-01-05
Hälsa 2020-01-05
Engelska 2020-01-08

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 SQLite, NULL s visas först vid sortering i stigande ordning och sist 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 Health 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

Lösning:

SELECT *
FROM exam
ORDER BY exam_year,
 (CASE exam_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    WHEN 'March' THEN 3
    WHEN 'April' THEN 4
    WHEN 'May' THEN 5
    WHEN 'June' THEN 6
    WHEN 'July' THEN 7
    WHEN 'August' THEN 8
    WHEN 'September' THEN 9
    WHEN 'October' THEN 10
    WHEN 'November' THEN 11
    WHEN 'December' THEN 12
  END),
  exam_day;

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

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

Diskussion:

För att sortera raderna efter examensdatum måste du först sortera efter år, sedan efter numerisk månad (inte månadsnamn) och slutligen efter dag. Du kan konvertera månadsnamn till numeriska månader med en CASE WHEN klausul. Efter CASE nyckelord, ange namnet på kolumnen. Sedan, efter varje NÄR, ange värdet i den här kolumnen, använd sökordet THEN och ange det nya värdet du vill tilldela istället för det gamla. Här är kolumnen exam_month , de aktuella värdena i den här kolumnen är 'January ', 'February ', …, 'December ', och de nya värdena är de numeriska månaderna 1 , 2 , …, 12 . När du är klar med att konvertera alla värden, kom ihåg att använda END nyckelord för att stänga CASE WHEN klausul. Ta en titt:

CASE exam_month
  WHEN 'January' THEN 1
  WHEN 'February' THEN 2
  WHEN 'March' THEN 3
  WHEN 'April' THEN 4
  WHEN 'May' THEN 5
  WHEN 'June' THEN 6
  WHEN 'July' THEN 7
  WHEN 'August' THEN 8
  WHEN 'September' THEN 9
  WHEN 'October' THEN 10
  WHEN 'November' THEN 11
  WHEN 'December' THEN 12
END

Så här konverterar du ett månadsnamn till ett månadsnummer. Du kan använda den när du sorterar raderna efter datum, det vill säga efter år, numerisk månad och dag.

ORDER BY exam_year,
 (CASE exam_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    WHEN 'March' THEN 3
    WHEN 'April' THEN 4
    WHEN 'May' THEN 5
    WHEN 'June' THEN 6
    WHEN 'July' THEN 7
    WHEN 'August' THEN 8
    WHEN 'September' THEN 9
    WHEN 'October' THEN 10
    WHEN 'November' THEN 11
    WHEN 'December' THEN 12
  END),
  exam_day

På så sätt kan du sortera raderna i stigande ordning efter datum. NULL s kommer att visas först. För att ändra ordningen till fallande, använd DESC nyckelord efter varje kolumn i ORDER BY klausul. Så här ska hela frågan se ut:

SELECT *
FROM exam
ORDER BY
  exam_year DESC,
  (CASE exam_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    WHEN 'March' THEN 3
    WHEN 'April' THEN 4
    WHEN 'May' THEN 5
    WHEN 'June' THEN 6
    WHEN 'July' THEN 7
    WHEN 'August' THEN 8
    WHEN 'September' THEN 9
    WHEN 'October' THEN 10
    WHEN 'November' THEN 11
    WHEN 'December' THEN 12
  END) DESC,
  exam_day DESC;

Observera att när du sorterar i fallande ordning i SQLite, NULL s visas sist.


  1. Gruppera efter månad och år i MySQL

  2. Kontrollera om en icke-LOB-kolumn behöver uppdateras

  3. Skapa en kolumn för automatisk ökning i SQLite

  4. PyMySQL kan inte ansluta till MySQL på localhost