首页 > 数据库 > SQL Server > SQL SERVER日期格式与多国语言问题
数据库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)来指定日期数据;逗号是可选的,而且忽略大小写。
以下是使用字母日期格式的一些指导:
·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]
Microsoft® SQL Server™ 2000 使用 datetime 和 smalldatetime 数据类型存储日期和时间数据。
没有只存储时间或日期的独立的时间和日期数据类型。当设置 datetime 或 smalldatetime 值时,如果只指定时间,则日期默认为 1900 年 1 月 1 日。如果只指定日期,则时间默认为 12:00 AM(午夜)。
对于 datetime 数据,可以执行如下操作:
可以使用系统日期函数进行一些关于 datetime 数据的算术运算。有关更多信息,请参见函数。
下面是一些使用日期和时间数据的准则:
·CREATE VIEW USA_Dates AS
·SELECT *
·FROM Northwind.dbo.Orders
·WHERE OrderDate < 'May 1, 1997'
当在查询中使用 datetime 常量,而且该查询由使用不同语言设置的连接执行时,需确保日期对于所有语言设置均是可以接受的。对于国际数据库中永久对象中的 datetime 常量,比如表约束和查看 WHERE 子句,必须同样小心。有关所有语言设置都解释为相同的日期格式的更多信息,请参见编写国际 Transact-SQL 语句。
SQL Server 可以识别以下列格式括在单引号 (') 中的日期和时间:
如果遵从以下准则,则使用 Transact-SQL 语句的数据库和数据库应用程序将更便于在语言间进行移植,或将支持多种语言:
· SELECT *
· FROM Northwind.dbo.Orders
· WHERE OrderDate = CONVERT(DATETIME, '7/19/1996', 101)
设置用于输入 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 @datevarGO SET DATEFORMAT ydmGODECLARE @datevar datetimeSET @datevar = '98/31/12'SELECT @datevarGO SET DATEFORMAT ymdGODECLARE @datevar datetimeSET @datevar = '98/12/31'SELECT @datevarGODBCC USEROPTIONS
sp_helplanguage
或者
use master
go
select * from syslanguages
go
在使用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 卻仍失敗, 探索原因在於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);
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/66009/viewspace-800869/ ,如需转载,请注明出处,否则将追究法律责任。