Logo SQL Server
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.
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 :
Voilà 10 ans que je n'avais pas écrit un petit texte pour souhaiter un joyeux… Read More
Cela faisait un petit moment que je n'avais pas créé de billets sur ce blog.… Read More
Explorez l'importance des user stories dans la méthode Agile à travers une vidéo humoristique qui… Read More
Parce que, contrairement à ce que l'on pourrait penser ce soir qu'il pleut des cordes,… Read More
Un peu d’humour en attendant le résultat des élections présidentielles françaises. Read More
Si vous n'avez pas accès à l'interface graphique de votre Linux, vous pouvez modifier l'horloge… Read More
View Comments