当用户语言不是英语时,使用CONVERT进行DATETIME / FLOAT转换不一致

时间:2012-07-09 18:34:27

标签: sql sql-server-2008 sql-server-2005 localization

在处理使用德语而不是英语的表示值的SQL Server 2005和SQL Server 2008时遇到一些问题。服务器和操作系统以德语版本运行。

SET LANGUAGE deutsch;
SELECT 
    CONVERT(datetime, '31. Dezember 1999') as a, 
    CONVERT(nvarchar, CONVERT(datetime, '31. Dezember 1999')) as b, 
    CONVERT(float,'3.14159') as p,
    CONVERT(nvarchar, CONVERT(float,'3.14159')) as q;

管理控制台中的输出是:

a=1999-12-31 00:00:00.000   
b=Dez 31 1999 12:00AM
c=3,14159   
d=3.14159
dateformat=dmy

这是不一致的。在(a)中,正确解析并显示Dec-31-1999的德语表示(并且只有德语工作..)。使用CONVERT显式转换相同的日期会返回一个字符串,该字符串将英语日期格式与德语缩写的月份名称混合在一起(如果您使用“Dez 31”而不是“Dec 31”则表示仔细观察)。

但是p从英语表示法(小数点)的字符串转换为浮点数,但以德语表示法(使用小数点逗号)显示,而显式转换到nvarchar再次以英语表示法生成数字。 OTOH CONVERT()不接受德语表示法中的输入以转换为浮点数。

所以,我有一个CONVERT函数:

  1. ,仅接受德语表示法转换为日期时间的字符串。
  2. 但接受字符串转换为仅在英语中浮动。
  3. 并将日期时间值转换为nvarchar,同时混合德语和英语
  4. 将浮动值转换为英语
  5. 但我需要的是SQL Server 2005,2008中的一个函数,它将当前用户语言的文本转换为支持的类型的值(datetime,float ...),并将这些值转换回文本表示形式。当前的用户语言。

    这个功能是什么?

1 个答案:

答案 0 :(得分:1)

SET LANGUAGE

  

[s]指定会话的语言环境。会议   language确定日期时间格式和系统消息。

设置CONVERT功能120的样式参数支持与语言无关的转换。

关于浮点值的转换,请查看these questions

通常,您应该避免在数据库中使用特定于语言的格式,并在UI中实现它。