ITPub博客

首页 > 数据库 > SQL Server > SQL SERVER日期格式与多国语言问题

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

原创 SQL Server 作者:kitesky 时间:2005-06-23 19:16:06 0 删除 编辑

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

[@more@]

数字日期格式

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 被解释为 202550 被解释为 1950。为避免模糊,请使用四位数字的年份。
  • 如果没有指定日,则默认值为当月第一天。
  • 当按字母形式指定月时,SET DATEFORMAT 会话设置不起作用。

使用日期和时间数据

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

没有只存储时间或日期的独立的时间和日期数据类型。当设置 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
  • 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 151998'
  • 未分隔的字符串格式(例如'19981207''December 12 1998'

编写国际化 Transact-SQL 语句

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

  • nchanvarchar ntext 代替所有的 charvarchar text 数据类型。这样就可以不必考虑代码页的转换问题。
  • 当执行月份和星期的比较与操作时,请使用数字日期,不要使用名称字符串。不同语言设置返回的月份和星期名称是不同的。例如,当语言设置为美国英语时,DATENAME(MONTH,GETDATE()) 返回 May,而当语言设置为德语时,返回 Mai,语言设置为法语时则返回 mai。应使用以数字而非名称表示月份的函数,如 DATEPART。当生成要显示给用户的结果集时,可使用DATEPART名称,因为日期名称通常比数字表示形式更有意义;但是,编写逻辑代码时不要使用任何依赖于特定语言显示的名称。
  • 当指定用于比较操作的日期或者用于 INSERT UPDATE 语句的输入的日期时,请使用对于所有的语言设置解释都相同的常量:
    • ADOOLE 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

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

语法

SET DATEFORMAT { format | @format_var }

参数

format | @format_var

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

注释

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

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

权限

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

示例

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

SET DATEFORMAT mdy
GO
DECLARE @datevar datetime
SET @datevar = '12/31/98'
SELECT @datevar
GO
 
SET DATEFORMAT ydm
GO
DECLARE @datevar datetime
SET @datevar = '98/31/12'
SELECT @datevar
GO
 
SET DATEFORMAT ymd
GO
DECLARE @datevar datetime
SET @datevar = '98/12/31'
SELECT @datevar
GO

返回当前连接的活动(设置)的 SET 选项

DBCC USEROPTIONS

报告某个备用语言或所有语言的信息

sp_helplanguage

或者

use master

go

select * from syslanguages

go

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

在使用SQL Server下如何讓您的程式能在不同的國家(地區)中咦髡??/span>撇開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 卻仍失敗, 探索原因在於itregion時間格式是 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);

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/66009/viewspace-800869/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-04-22

  • 博文量
    273
  • 访问量
    2169350