技术开发 频道

SQL SERVER日期格式与多国语言问题

  SQL SERVER日期格式与多国语言问题(二)

  SQL Server 在运行时计算 datetime 常量。用于某种语言期望的日期格式的日期字符串,如果由使用不同语言和日期格式设置的连接来执行查询,则可能无法识别。例如,下面的视图对于语言设置为美国英语的连接可以工作正常,但对于其它语言设置的连接就不能工作正常:

  · CREATE VIEW USA_Dates AS
  ·SELECT *FROM Northwind.dbo.Orders WHERE OrderDate < 'May 1,1997'

  当在查询中使用 datetime 常量,而且该查询由使用不同语言设置的连接执行时,需确保日期对于所有语言设置均是可以接受的。对于国际数据库中永久对象中的 datetime 常量,比如表约束和查看 WHERE 子句,必须同样小心。有关所有语言设置都解释为相同的日期格式的更多信息,请参见编写国际 Transact-SQL 语句。

  SQL Server 可以识别以下列格式括在单引号 (') 中的日期和时间:

  字母日期格式(例如,'April 15,1998')
  数字日期格式(例如,'4/15/1998'、'April 15,1998')
  未分隔的字符串格式(例如'19981207'、'December 12, 1998')
  编写国际化 Transact-SQL 语句

  如果遵从以下准则,则使用 Transact-SQL 语句的数据库和数据库应用程序将更便于在语言间进行移植,或将支持多种语言:

  用 ncha、nvarchar 和 ntext 代替所有的 char、varchar 和 text 数据类型。这样就可以不必考虑代码页的转换问题。

  当执行月份和星期的比较与操作时,请使用数字日期,不要使用名称字符串。不同语言设置返回的月份和星期名称是不同的。例如,当语言设置为美国英语时,DATENAME(MONTH,GETDATE()) 返回 May,而当语言设置为德语时,返回 Mai,语言设置为法语时则返回 mai。应使用以数字而非名称表示月份的函数,如 DATEPART。当生成要显示给用户的结果集时,可使用DATEPART名称,因为日期名称通常比数字表示形式更有意义;但是,编写逻辑代码时不要使用任何依赖于特定语言显示的名称。

  当指定用于比较操作的日期或者用于 INSERT 或 UPDATE 语句的输入的日期时,请使用对于所有的语言设置解释都相同的常量:

  ADO、OLE DB 和 ODBC 应用程序应该使用以下的 ODBC 时间戳、日期和时间转义子句:{ ts 'yyyy-mm-dd hh:mm:ss[.fff] '},例如 { ts '1998-09-24 10:02:20' } { d 'yyyy-mm-dd'},例如 { d '1998-09-24' } { t 'hh:mm:ss'},例如 { t '10:02:20'}

  使用其它 API 的应用程序或 Transact-SQL 脚本、存储过程和触发器都应该使用连在一起的数字字符串(例如 yyyymmdd 为 19980924)。

  使用其它 API 的应用程序或 Transact-SQL 脚本、存储过程和触发器都应该使用带有显式参数的 CONVERT 语句,以进行 date 和 smalldate 数据类型及字符串数据类型之间的所有转换。例如,下列语句的解释对于所有语言或日期格式连接设置都是相同的:

SELECT * FROM Northwind.dbo.Orders WHERE OrderDate = CONVERT DATETIME,'7/19/1996'101)SET DATEFORMAT

  设置用于输入 datetime 或 smalldatetime 数据的日期部分(月/日/年)的顺序。

  语法

SET DATEFORMAT { format | @format_var }

  参数:format | @format_var

  日期部分的顺序。可以是 Unicode 或转换为 Unicode 的 DBCS。有效参数包括 mdy、dmy、ymd、ydm、myd 和 dym。美国英语默认值是 mdy。

  注释

  该设置仅用在将字符串转换为日期值时的解释中。它对日期值的显示没有影响。

  SET DATEFORMAT 的设置是在执行或运行时设置,而不是在分析时设置。

  权限

  SET DATEFORMAT 权限默认授予所有用户。

  示例

  下例使用不同的日期格式处理不同格式的日期字符串。

SET DATEFORMAT mdyGODECLARE @datevar datetimeSET @datevar = '12/31/98'SELECT @datevar GO SET DATEFORMAT ydmGODECLARE @datevar datetimeSET @datevar = '98/31/12'SELECT @datevar GO SET DATEFORMAT ymdGODECLARE @datevar datetime SET @datevar = '98/12/31'SELECT @datevar GO

  返回当前连接的活动(设置)的 SET 选项 DBCC USEROPTIONS;报告某个备用语言或所有语言的信息 p_helplanguage 或者

use master go select * from syslanguages go

  在使用SQL Server下如何程序能在不同的国家(地区)中运行正常

  在使用SQL Server下如何程序能在不同的国家(地区)中运行正常。抛开Unicode不谈,日期格式的差异会是撰写程式时另一个最需要重视的地方不同地区与文化日期各有其差异,如:美国us:M/d/y H:m:d,義大利it:d/M/y H.m.d,英国uk:d/M/y H:m:d,台湾tw:y/M/d H:m:d,中国cn:y-M-d H:m:d首先必须统一OS日期写入格式如:Now.ToString("yyyy/MM/dd HH:mm:ss") 在SQL Server预设中日期格式为 Mdy,此时在预设未修正程式的情況写入SQL it/uk 会因为如:13/02/2004 无法正确判断是月或日而写入失败,tw/cn 则能够自动转换而不会出错。这时我们在SQL的执行时期更改SET DATEFORMAT ymd,如此一來就与Now.ToString("yyyy/MM/dd HH:mm:ss")是一致了,uk已可正常写入,但 it 卻仍失败,探索原因在于it的region时间格式是 H.m.d,虽然 Now.ToString("yyyy/MM/dd HH:mm:ss")已指定:为时间分隔符号,但仍会因文化特性而自动转换为OS內建格式(Region and Language)为此我们再做更改 Now.ToString("yyyy/MM/dd HH:mm:ss",System.Globalization.DateTimeFormatInfo.InvariantInfo))使其日期输出与文化特性无关(即不受OS日期格式设定所影响),总結上面的说法:

  1. 统一日期输入格式 Now.ToString("yyyy/MM/dd HH:mm:ss")

  2. 更改 SQL 执行时期日期格式 SET DATEFORMAT ymd

  3. 统一日期输入格式与文化无关 Now.ToString("yyyy/MM/dd HH:mm:ss",system.Globalization.DateTimeFormatInfo.InvariantInfo))如此一來所有地区的日期与时间型态都能够正常支援了.注:yyyy/MM/dd HH:mm:ss只是一个范例参考,主要只需与SQL的 DATEFORMAT一致即可。

  另外,使用AddParameter将能自动的把.net的日期格式转换成与SQL Server服务器一致的日期格式。更加方便快捷。AddParameter("@delete_date",(long)System.Data.SqlDbType.DateTime,System.DateTime.Now);

0
相关文章