Logo SQL Server SSMS

[SQL] Fonction pour convertir une date écrite en toutes lettres en une date de type date.

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:		Arn
-- 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 :


4 commentaires sur « [SQL] Fonction pour convertir une date écrite en toutes lettres en une date de type date. »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.