sql >> Databasteknik >  >> RDS >> Mysql

Hur man beställer efter månadsnamn i MySQL

Problem:

Du vill sortera raderna efter månadsnummer, givna månadsnamn (du vill att januari ska visas först, december sista).

Exempel:

birthday Tabellen innehåller två kolumner:namn och birthday_month . Månaderna anges i namn, inte i siffror.p>

namn födelsedag_månad
Ronan Tisha NULL
December 2020
Angie Julia April
Narelle Dillan April
Purdie Casey Januari
Donna Nell NULL
Blaze Graeme Oktober

Du vill sortera raderna efter birthday_month .

Lösning:

SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');

Resultatet ser ut så här:

namn födelsedag_månad
Donna Nell NULL
Purdie Casey Januari
Angie Julia April
Narelle Dillan April
Blaze Graeme Oktober
Ronan Tisha NULL
December Oktober

Diskussion:

För att beställa per månad, skapa ett datum med denna månad. För att göra detta, använd STR_TO_DATE()-funktionen. Om du har ett datum lagrat som en sträng i 'Year Month Day ' format, kan du casta det till ett datum med STR_TO_DATE(date_string, '%Y %M %d') .

Först måste du skapa en sträng med CONCAT()-funktionen. Året kan vara vilket år du vill (t.ex. 0001 ) och dagen kan vara vilken dag du vill (t.ex. 01 ):

CONCAT('0001 ', birthday_month, ' 01')

CONCAT() funktion kombinerar alla argument till en sträng. Strängen ska finnas i 'Year Month Day ' format, så det andra argumentet bör vara birthday_month; det första och det tredje argumentet behöver bara vara i rätt format.

Sedan måste du konvertera denna sträng till ett datum med STR_TO_DATE(date_string, '%Y %M %d') fungera. Det andra argumentet för denna funktion är formatet på datumet. %Y står för år, %M står för månad (dess fullständiga namn, inte ett nummer), och %d står för dag.

STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')

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 birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;

Observera att i MySQL, NULL s visas först vid sortering i stigande ordning och sist vid sortering i fallande ordning. Dessutom raderna med samma birthday_month visas i slumpmässig ordning (du kan se Angie Julia tredje och Narelle Dillan fjärde, eller Narelle Dillan tredje och Angie Julia fjärde).


  1. Hur man fixar "datediff-funktionen resulterade i ett spill"-fel i SQL Server

  2. Hur man lägger till standardbegränsning till befintliga kolumner i SQL Server-tabellen - SQL Server / TSQL självstudie del 91

  3. Grunderna för tabelluttryck, del 1

  4. SYSUTCDATETIME() vs GETUTCDATE() i SQL Server:Vad är skillnaden?