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
———————————————-

Un article de zinzineti