APSQL

TO_CHAR

Ou comment convertir facilement des données de type date/heure vers une chaine de caractères

Lorsque l'on travail avec des données de type date/heure (datetime, datetime2, smalldatetime, ...) la conversion vers la chaine de caractères n'est pas tjrs facile surtout si le format par défaut n'est pas présent dans les style de conversions porposés en standard par SQL Server avec la fonction CONVERT.

Je propose donc la fonction to_char (eh bien il y a bien un inspiration Oracle) qui accepte en paramètre le format de date que l'on souhaite obtenir ainsi qu'une donnée de type datetime. Il est facile d'adapter la fonction à accepter d'autre type de données comme datetime2 en modifiant le type du pramètre.

Pour positionner les éléments de dates exactement comme on le souhaite dans la chaine de caractères généré, les formats suivants sont définis

FormatSignification
YYYYannée
QQnuméro du trimestre
MMnuméro du mois
MONTHnom du mois
DDNuméro du jour dans le mois
DYNuméro du jour dans l'année
WWNuméro du jour dans la semaine
DWNom du jour
HHHeures
MIMinutes
SSSecondes
create function to_char(@format varchar(100),@date datetime) returns varchar(100)
begin
    declare @valeurTexte varchar(500);
    set @valeurTexte=@format;            
    set @valeurTexte=replace(@valeurTexte,'MM',datepart(MM,@date));
    -- année : pb année sur 2 chiffres
    set @valeurTexte=replace(@valeurTexte,'YYYY',datepart(YYYY,@date));
    -- trimestre
    set @valeurTexte=replace(@valeurTexte,'qq',datename(qq,@date));
    -- jours
    set @valeurTexte=replace(@valeurTexte,'DY',datepart(DY,@date));
    set @valeurTexte=replace(@valeurTexte,'DW',datename(DW,@date));
    set @valeurTexte=replace(@valeurTexte,'WW',datename(WW,@date));
    set @valeurTexte=replace(@valeurTexte,'DD',datepart(DD,@date));
    -- heures minutes et secondes
    set @valeurTexte=replace(@valeurTexte,'HH',datepart(HH,@date));
    set @valeurTexte=replace(@valeurTexte,'MI',datepart(MI,@date));
    set @valeurTexte=replace(@valeurTexte,'SS',datepart(SS,@date));    
    return @valeurTexte;
end;
go

Exemple de fonctionnement:

Exemple d'utilisation de to_char