您的位置:首页 > 数据库

SQL Server的日期输入输出格式设置(转)

2009-08-04 22:31 417 查看
default language选项SQL Server定义了33种自然语言,每种语言确定了一种日期解释方法,这些语言定义存储在系统表syslanguages中,每种语言由一个语言标识符(ID)标识。
SQL Server实例的默认语言由系统选项default language确定,可以通过sp_configure修改:
EXEC sp_configure 'default language' , [langid]
langid是语言ID,对应系统表syslanguages的langid列。例如,下面的代码把当前实例的默认语言设置为English(langid=0)
USE master
EXEC sp_configure 'default language',0
RECONFIGURE WITH OVERRIDE
每个SQL Server实例对所有与服务器的连接都使用默认语言,但是每个连接也可以自行设置用于连接的SQL Server语言。
(1) Microsoft ActiveX数据对象和OLE DB应用程序可以在连接时所指定的提供程序字符串中包括language关键字。对于OLE DB应用程序,也可以在连接之前,设置提供程序专用属性:SSPROP_INIT_CURRENTLANGUAGE。
(2) 开放式数据库连接(ODBC)应用程序可以在SQLDriverConnect上所指定的连接字符串中包括language关键字。ODBC应用程序还可以在SQL Server ODBC数据源定义中指定语言设置。
(3) DB-Library应用程序可以使用dblogin分配loginrec,然后在调用dbopen打开连接之前使用DBSETNATLANG宏指定语言设置。
(4) 任何应用程序都可以使用SET LANGUAGE语句指定SQL Server语言
SET DATEFIRST
SET DATEFIRST设置一周的第一天是星期几,该设置对所有用户均有效,除非再次修改,否则该设置将一直保留。
SET DATEFIRST的具体语法如下:
SET DATEFIRST { number | @number_var }
其中参数number | @number_var是一个整数,表示一周的第一天。允许的值是1~7,1表示一周的第一天是星期一,7表示一周的第一天对应为星期日。number的默认值是7(即一周的第一天为星期日)。可以通过查询系统变量@@DATEFIRST获取当前的SET DATEFIRST设置值。
DATENAME(dw,date)及DATEPART(dw,date)的结果会受到SET DATEFIRST设置值的影响

SET DATEFORMAT
SET DATEFORMAT设置用于输入datetime或smalldatetime数据的日期部分(月/日/年)的顺序。仅用在将字符串转换为日期值时的解释中,它对日期值的显示没有影响。
SET DATEFORMAT的具体语法如下:
SET DATEFORMAT { format | @format_var }
其中参数format | @format_var是日期部分的顺序。有效参数包括mdy、dmy、ymd、ydm、myd 和 dym。
SET DATEFORMAT的设置是在执行或运行时设置,而不是在分析时设置。它仅作用于当前会话环境,当前会话环境关闭后自动失效。
SET DATEFORMAT设置中有几个需要注意的地方。
(1) SET DATEFORMAT设置对使用CONVERT把字符型日期转换为日期的处理也具有影响,但不影响明确指定了style的CONVERT处理。
例如,在下面的示例中,第一个CONVERT转换未指定style,转换的结果受SET DATAFORMAT的影响,第二个CONVERT转换指定了style,转换结果受style的影响。
--设置输入日期顺序为 日/月/年
SET DATEFORMAT DMY

--不指定Style参数的CONVERT转换将受到SET DATEFORMAT的影响
SELECT CONVERT(datetime,'2-1-2005')
--结果: 2005-01-02 00:00:00.000

--指定Style参数的CONVERT转换不受SET DATEFORMAT的影响
SELECT CONVERT(datetime,'2-1-2005',101)
--结果: 2005-02-01 00:00:00.000
(2) 如果输入的日期包含了世纪部分,则对日期进行解释处理时,年份的解释不受SET DATEFORMAT设置的影响。
例如,在下面的代码中,同样的SET DATEFORMAT设置,输入日期的世纪部分与不输入日期的世纪部分,解释的日期结果不同。
DECLARE @dt datetime

--设置SET DATEFORMAT为:月日年
SET DATEFORMAT MDY

--输入的日期中指定世纪部分
SET @dt='01-2002-03'
SELECT @dt
--结果: 2002-01-03 00:00:00.000

--输入的日期中不指定世纪部分
SET @dt='01-02-03'
SELECT @dt
--结果: 2003-01-02 00:00:00.000
(3) 如果输入的日期不包含日期分隔符,那么SQL Server在对日期进行解释时,将忽略SET DATEFORMAT的设置。
例如,在下面的代码中,不包含日期分隔符的字符日期,在不同的SET DATEFORMAT设置下,其解释的结果是一样的。
DECLARE @dt datetime

--设置SET DATEFORMAT为:月日年
SET DATEFORMAT MDY
SET @dt='010203'
SELECT @dt
--结果: 2001-02-03 00:00:00.000

--设置SET DATEFORMAT为:日月年
SET DATEFORMAT DMY
SET @dt='010203'
SELECT @dt
--结果: 2001-02-03 00:00:00.000

--输入的日期中包含日期分隔符
SET @dt='01-02-03'
SELECT @dt
--结果: 2003-02-01 00:00:00.000
SET LANGUAGE
SET LANGUAGE指定会话的语言环境。会话语言确定了datetime显示格式和系统信息。
SET LANGUAGE的具体语法如下:
SET LANGUAGE { [ N ] 'language' | @language_var }
其中参数
'language' | @language_var是存储在系统表syslanguages中的语言名称,表结构定义可以参考表2-5,语言名称与syslanguages系统表的关系可以参考表2-6。该参数可以是UNICODE,或者是转换为UNICODE的DBCS(双字节字符集)。若要指定使用UNICODE的语言,应使用N'language'。如果将语言指定为变量,则变量的数据类型必须为sysname。
SET LANGUAGE是在执行或运行时设置,而不是在分析时设置。它仅作用于当前会话环境,当前会话环境关闭后自动失效。
受SET LANGUAGE设置影响的日期处理函数是DATENAME和CONVERT,具体的影响如表2-6所示。
表2-6 SET LANGUAGE 、DATENAME、CONVERT与系统表syslanguages列的关系
列名
与SET LANGUAGE 、DATENAME、CONVERT的关系
name
SET LANGUAGE的language(语言名称)的许可参数
alias
months
决定DATENAME (Month,date )的返回值
shortmonths
影响CONVERT 将日期转换字字符,Style={6,106,7,107,9,109,13,113,100}时,输出的字符串中的month部分的值
days
决定DATENAME (Weekday,date )的返回值

以下示例演示了在不同的语言环境下,DATENAME与CONVERT函数的不同结果。
USE master

--设置会话的语言环境为: English
SET LANGUAGE N'English'
SELECT
DATENAME(Month,GETDATE()) AS [Month],
DATENAME(Weekday,GETDATE()) AS [Weekday],
CONVERT(varchar,GETDATE(),109) AS [CONVERT]
/*--结果:
Month Weekday CONVERT
------------- -------------- -------------------------------
March Tuesday Mar 15 2005 8:59PM
--*/

--设置会话的语言环境为: 简体中文
SET LANGUAGE N'简体中文'
SELECT
DATENAME(Month,GETDATE()) AS [Month],
DATENAME(Weekday,GETDATE()) AS [Weekday],
CONVERT(varchar,GETDATE(),109) AS [CONVERT]
/*--结果
Month Weekday CONVERT
------------- --------------- -----------------------------------------
05 星期四 05 19 2005 2:49:20:607PM
--*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐