Aujourd’hui, mon client m’a demandé de lui filtrer les données d’une base de données en fonction d’une date écrite en toutes lettres. A ma connaissance, il n’y a pas de fonction SQL native permettant de faire ça :s.

Logo SQL Server SSMS

Logo SQL Server

J’ai donc du écrire une fonction SQL pour le faire.
Voici le code de la fonction scalar ‘fn_ConvertStringDate’

USE [MABASE]
GO
/****** Object: UserDefinedFunction [dbo].[fn_ConvertStringDate] Script Date: 9/27/2013 6:41:58 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— =============================================
— Author: Arnaud YVOZ
— Create date: 29/7/2013
— Description: Prend une date type nvarchar d’une taille de maximum 25 caractères (exemple : ‘janvier 2013’) et retourne une date ‘2013-01-01’ au format date
— =============================================
CREATE FUNCTION [dbo].[fn_ConvertStringDate]
(
— Add the parameters for the function here
@mois nvarchar(25)
)
RETURNS Date
AS
BEGIN
— Declare the return variable here
— Add the T-SQL statements to compute the return value here
— Return the result of the function
RETURN (SELECT CONVERT(date,(SUBSTRING(@mois,Len(@mois)-3,4)
+ Case
when CHARINDEX(‘janvier’, @mois)>0 then ‘-01-‘
when CHARINDEX(‘février’, @mois)>0 then ‘-02-‘
when CHARINDEX(‘mars’, @mois)>0 then ‘-03-‘
when CHARINDEX(‘avril’, @mois)>0 then ‘-04-‘
when CHARINDEX(‘mai’, @mois)>0 then ‘-05-‘
when CHARINDEX(‘juin’, @mois)>0 then ‘-06-‘
when CHARINDEX(‘juillet’, @mois)>0 then ‘-07-‘
when CHARINDEX(‘août’, @mois)>0 then ‘-08-‘
when CHARINDEX(‘septembre’, @mois)>0 then ‘-09-‘
when CHARINDEX(‘octobre’, @mois)>0 then ‘-10-‘
when CHARINDEX(‘novembre’, @mois)>0 then ‘-11-‘
when CHARINDEX(‘décembre’, @mois)>0 then ‘-12-‘
END
+ ’01’)))

END

Et pour appeler cette fonction il vous suffit de faire un Select (en sachant que vous devez fournir une chaine ‘nvachar’ de 25 caractères maximum.)
:

select fn_ConvertStringDate(‘janvier 2012’) ;
–Return ‘2012-01-01’

La requête précédente vous retourne donc ‘2012-01-01’ au format date (YYYY-MM-DD).
La fonction est de type scalar car elle nous renvoie un résultat unique.

SUBSTRING(@mois,Len(@mois)-3,4) : Permet d’obtenir les 4 derniers caractères de la chaine soit l’année.
Case when CHARINDEX(‘janvier’, @mois)>0 then ‘-01-‘ etc.. : Permet suivant que l’on trouve le nom du mois d’ajouter à la chaine sont équivalent en chiffre.
Et le convert permet de convertir la chaine créée au format date.

Alors bien sûr on peut aller beaucoup plus loin avec cette fonction en liant celle-ci avec une table de traduction des mois par exemple. (Et si vous avez d’autres idées d’évolutions je suis preneur). L’exemple précédent fonctionne bien sûr qu’avec des dates écrites en français.

Je vous conseille de lire également :
[SQL] Comment remplir une table avec tous les jours de l’année?

Mots clefs liés à cet article:

  • convertir un une date écrite en nombre
  • MOIS EN LETTRE SQL
  • sql en toute lettres
  • convertir date en lettre sql
  • @MOIS SQL
  • sql convertir en mois
  • sql server convertir une date en chaine de caractere
  • sql transformer date en lettre
  • sqldate en lettre
  • sqlserver nombre enregistrement dans toutes les tables