Le saviez vous ? SQL maintient la liste des noms des mois et jours de la semaine dans l'ensemble des langues qu'il gère ! (Surement pour pouvoir faire fonctionner la fonction FORMAT).
Mais cela peut être utile dans certaines "compositions de textes" d'avoir ces noms, alors voici comment j'extrais ces données de SQL Server.
Pour les mois :
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS Num_month, [value] As [Month]
FROM sys.syslanguages s CROSS APPLY string_split(months, ',')
---WHERE lcid = 1036 ---
[name] = 'Français'
WHERE [name] = 'us_english'
Quelques explications :
- L'info est dans la colonne "months" de la table sys.syslanguages, mais cette colonne contient une chaine avec tous les mois séparés par des virgules.
- Donc j'utilise STRING_SPLIT pour couper la chaine en 12 lignes et CROSS APPLY pour faire en sorte que cela s'extrait correctement (sans passer par une variable).
- Le ROW_NUMBER() permet d'avoir le numéro du mois associé au nom extrait. (A noter le (SELECT NULL) qui permet de contourner le tri obligatoire de cet opérateur !)
- Enfin le WHERE permet de choisir sa langue : Soit par le LCID (1036 pour le français par exemple) soit par son nom !
Pour information, les mois en abrégés sont aussi disponibles : dans la colonne "shortmonths".
Pour les jours de la semaine (c'est le même principe) :
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - datefirst + 14) % 7 + 1 AS Num_day, [value] As [day]
FROM sys.syslanguages s CROSS APPLY string_split(days, ',')
WHERE lcid = 1036 --- [name] = 'Français'
--WHERE [name] = 'us_english'
Quelques explications :
- L'info est dans la colonne "days" de la table sys.syslanguages,
- STRING_SPLIT, CROSS APPLY : Tout pareil que ci-dessus.
- ATTENTION ici le ROW_NUMBER() prend en compte la colonne "datefirst" pour faire en sorte que les numéros obtenus permettent de trier les jours dans le bon ordre en fonction de la langue (En Anglais et d'autres langues c'est le Dimanche le premier jour de la semaine !!). On retire "datefirst" et on ajout 14 pour être certain d'avoir un nombre positif qui avec le modulo sera ramené entre 0 et 6 d'où le +1 final pour avoir un nombre entre 1 et 7 !!
- Ajustez le WHERE pour choisir la langue.
Alternative : (??!)
Si on a le numéro du mois pour avoir le nom :
DECLARE @Month INT = 7 --- Juillet
SELECT FORMAT(CONVERT(DATE, '2000-' + FORMAT(@Month, '00') + '-01T00:00:00'), 'MMMM') AS [Month]