sql >> Database teknologi >  >> RDS >> Mysql

Sådan bestiller du efter månedsnavn i MySQL

Problem:

Du vil sortere rækkerne efter månedsnummer, givet månedsnavne (du ønsker, at januar skal vises først, december sidste).

Eksempel:

birthday tabel indeholder to kolonner:navn og birthday_month . Månederne er angivet i navne, ikke i tal.p>

navn fødselsdag_måned
Ronan Tisha NULL
December 2020
Angie Julia April
Narelle Dillan April
Purdie Casey Januar
Donna Nell NULL
Blaze Graeme Oktober

Du vil sortere rækkerne efter birthday_month .

Løsning:

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

Resultatet ser således ud:

navn fødselsdag_måned
Donna Nell NULL
Purdie Casey Januar
Angie Julia April
Narelle Dillan April
Blaze Graeme Oktober
Ronan Tisha NULL
December Oktober

Diskussion:

For at bestille efter måned skal du oprette en dato med denne måned. For at gøre dette skal du bruge STR_TO_DATE()-funktionen. Hvis du har en dato gemt som en streng i 'Year Month Day ' format, kan du caste det til en dato ved hjælp af STR_TO_DATE(date_string, '%Y %M %d') .

Først skal du oprette en streng ved hjælp af CONCAT()-funktionen. Året kan være et hvilket som helst år, du ønsker (f.eks. 0001 ), og dagen kan være hvilken som helst dag, du ønsker (f.eks. 01 ):

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

CONCAT() funktion kombinerer alle argumenterne i én streng. Strengen skal være i 'Year Month Day ' format, så det andet argument skal være birthday_month; det første og det tredje argument skal blot være i de rigtige formater.

Derefter skal du konvertere denne streng til en dato ved hjælp af STR_TO_DATE(date_string, '%Y %M %d') fungere. Det andet argument for denne funktion er formatet på datoen. %Y står for år, %M står for måned (dets fulde navn, ikke et tal), og %d står for dag.

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

Brug den med en ORDER BY klausul for at sortere rækkerne i stigende rækkefølge efter dato. Hvis du gerne vil se rækkerne i faldende rækkefølge, skal du blot tilføje en DESC søgeord som dette:

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

Bemærk, at i MySQL, NULL s vises først ved sortering i stigende rækkefølge og sidst ved sortering i faldende rækkefølge. Også rækkerne med den samme birthday_month vises i tilfældig rækkefølge (du kan muligvis se Angie Julia tredje og Narelle Dillan fjerde, eller Narelle Dillan tredje og Angie Julia fjerde).


  1. Heroku og Rails:Gem Load Error med Postgres, men det er specificeret i GEMFILE

  2. Funktion til at returnere dynamisk sæt af kolonner for en given tabel

  3. MySQL:ALTER IGNORE TABLE TILFØJ UNIK, hvad vil blive afkortet?

  4. Tilslutning af RazorSQL til Salesforce.com