【IT168技术文档】

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

  数据库language不同,sql server对日期格式的选择也不同。

  数字日期格式

  Microsoft® SQL Server™ 2000 允许用指定的数字月份指定日期数据。例如,5/20/97 表示 1997 年 5 月的第 20 天,当使用数字日期格式时,在字符串中以斜杠(/)、连字符(-)或句号(.)作为分隔符来指定月、日、年。字符串必须以下面的形式出现:数字 分隔符 数字 分隔符 数字 [时间] [时间]

  下面的数字日期格式是有效的:

  [0]4/15/[19]96 -- (mdy)[0]4-15-[19]96 -- (mdy)[0]4.15.[19]96 -- (mdy)[04]/[19]96/15 -- (myd) 15/[0]4/[19]96 -- (dmy)15/[19]96/[0]4 -- (dym)[19]96/15/[0]4 -- (ydm)[19]96/[04]/15 -- (ymd)当语言被设置为 us_english 时,默认的日期顺序是 mdy。可以使用 SET DATEFORMAT 语句改变日期的顺序,根据所用的语言,它也会影响日期顺序。

  对 SET DATEFORMAT 的设置决定了如何解释日期数据。如果顺序和设置不匹配,则该值不会被解释为日期(因为它们超出了范围),或者被错误地解释。例如,根据不同的 DATEFORMAT 设置,12/10/08 能被解释为六种日期的一种。

  字母日期格式

  Microsoft® SQL Server™ 2000 允许使用以当前语言给出的月的全名(如 April)或月的缩写(如 Apr)来指定日期数据;逗号是可选的,而且忽略大小写。

  以下是使用字母日期格式的一些指导:

  把日期和时间数据括在单引号中 (')。

  下面是 SQL Server 日期数据的合法字母格式(括号内的字符是可选字符):

  · Apr[il] [15][,] 1996
  · Apr[il] 15[,] [19]96
  · Apr[il] 1996 [15]
  · [15] Apr[il][,] 1996
  · 15 Apr[il][,][19]96
  · 15 [19]96 apr[il]
  · [15] 1996 apr[il
  · 1996 APR[IL] [15]
  · 1996 [15] APR[IL]

  如果只指定年份的最后两位数字,则小于 two digit year cutoff 配置选项值最后两位数字的值与缩略形式的年份位于同一个世纪。大于或等于该选项值的值位于缩略形式年份的上一世纪。例如,如果 two digit year cutoff 为 2050(默认),则 25 被解释为 2025,50 被解释为 1950。为避免模糊,请使用四位数字的年份。

  如果没有指定日,则默认值为当月第一天。

  当按字母形式指定月时,SET DATEFORMAT 会话设置不起作用。

  使用日期和时间数据

  Microsoft® SQL Server™ 2000 使用 datetime 和 smalldatetime 数据类型存储日期和时间数据。

  没有只存储时间或日期的独立的时间和日期数据类型。当设置 datetime 或 smalldatetime 值时,如果只指定时间,则日期默认为 1900 年 1 月 1 日。如果只指定日期,则时间默认为 12:00 AM(午夜)。

  对于 datetime 数据,可以执行如下操作:

  键入新的数据或更改现有的数据。

  进行日期和时间的计算,比如日期的加或减。有关日期算法的更多信息,请参见 +(加)和 -(减)。

  搜索特定的日期和/或时间。

  可以使用系统日期函数进行一些关于 datetime 数据的算术运算。有关更多信息,请参见函数。

  下面是一些使用日期和时间数据的准则:

  若要对日期和时间进行精确搜索匹配,请使用等号(=)。Microsoft SQL Server 以 12:00:00:000 AM(默认值)的精确时间形式返回年、月、日都完全匹配的日期和时间值。

  若要搜寻日期或时间的一部分,请使用 LIKE 运算符。SQL Server 首先把数据转换为 datetime 格式然后再转换为 varchar 格式。由于标准时间显示格式不包括秒和毫秒,不能使用 LIKE 和匹配模式对其搜索,除非使用 CONVERT 函数并把 style 参数设为 9 或 109。有关部分日期和时间搜索的更多信息,请参见 LIKE。

1

 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);

 

通过asp.net数据库链接的语言环境与asp.net一样来控制多国语言1