avril
2011
Disons-le tout de suite que le format ISO 8601 relatif aux données date et heure est :
YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm]
Le T indique le début de la partie heure de la valeur date-heure.
la partie [.nnnnnnn][{+|-}hh:mm] est optionnelle
Exemple de données date heure respectant la norme ISO :
2011-04-08T18:55:50
Voyons l’avantage du respect de la norme ISO pour les données date et heure
– Imposons la langue us_english
SET LANGUAGE us_english
GO
SELECT CAST('2010-05-31 14:55:50' AS DATETIME) –> résultat : OK
GO
SELECT CAST('2010-05-31 14:55:50' AS DATETIME2) –> résultat : OK
GO
– Imposons la langue Française
SET LANGUAGE Français
SELECT CAST('2010-05-31 14:55:50' AS DATETIME) –> résultat : KO
GO
SELECT CAST('2010-05-31 14:55:50' AS DATETIME2) –> résultat : OK
GO
Pourquoi l’exécution de la requête
SET LANGUAGE Français
SELECT CAST('2010-05-31 14:55:50' AS DATETIME)
GO
revoie l’erreur suivante : Msg 242, Level 16, State 3, Line 1
La conversion d’un type de données varchar en type de données datetime a créé une valeur hors limites.
C’est bien le paramètre LANGUE ou DATEFORMAT qui est la base de ce comportement versatile observé.
Quand la langue de la session est positionnée à us_english, DATEFORMAT prend la valeur mdy (month/day/year) et donc ‘2010-05-31 14:55:50′ est bien interpreté par SQL SERVER comme une date valide. Par contre si la langue de la session est Français, DATEFORMAT prend la valeur dmy et ‘2010-05-31 14:55:50′ n’est plus reconnu comme une date valide pour SQL SERVER.
On peut noter au passage que ces deux paramètres (DATEFORMAT ou LANGUE) influencent la fonction ISDATE. c’était une parenthèse
Que faut-il donc faire lorsqu’on doit écrire une procédure SQL multilangue ?
Il faut avant tout utiliser les types unicodes (nchar, nvarchar) et surtout resté ISO pour les types date et heure.
Soyons ISO
– Imposons la langue us_english
SET LANGUAGE us_english
GO
SELECT CAST('2010-05-31T14:55:50' AS DATETIME) –> résultat : OK
GO
SELECT CAST('2010-05-31T14:55:50' AS DATETIME2) –> résultat : OK
GO
– Imposons la langue Française
SET LANGUAGE Français
GO
SELECT CAST('2010-05-31T14:55:50' AS DATETIME) –> résultat : OK
GO
SELECT CAST('2010-05-31T14:55:50' AS DATETIME2) –> résultat : OK
GO
–> EXECEPTION : le format YYYYMMDD hh:mm:ss[.nnnnnnn][{+|-}hh:mm] n’est pas ISO mais marche à tous les coups !
SET LANGUAGE us_english
GO
SELECT CAST('20100531 14:55:50' AS DATETIME) –> résultat : OK
GO
SELECT CAST('20100531 14:55:50' AS DATETIME2) –> résultat : OK
GO
– Changeons la langue Français
SET LANGUAGE Français
GO
SELECT CAST('20100531 14:55:50' AS DATETIME) –> résultat : OK
GO
SELECT CAST('20100531 14:55:50' AS DATETIME2) –> résultat : OK
GO
–> POURQUOI le format YYYYMMDD hh:mm:ss[.nnnnnnn][{+|-}hh:mm] qui n’est pas ISO marche à tous les coups sous SQL SERVER ?!
———————————————-
Etienne ZINZINDOHOUE
———————————————-