[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.
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 :
- [SQL] Comment remplir une table avec tous les jours de l’année?
- https://sql.sh/ :: SQL CONVERT() (MySQL et SQL Server)
4 commentaires sur « [SQL] Fonction pour convertir une date écrite en toutes lettres en une date de type date. »