T-SQL Programming 1:DateTime Datatype part1 |
本文标签:T-SQL DateTime DateTime 是使用最多和出现问题最多的数据类型之一 。主要存在以下问题:
一、DateTime存储格式 在讲解DateTime存储格式之前,需要纠正一个概念 。组成DateTime类型的各个部分:year ,Month,day,hour,minute,second,millisecond,不是独立存储 。相反,DateTime作为整体,用两个4byte整数存储 。 一个单独的DateTime类型需要 8byte存储,前4个byte存储 1900-1-1之前或者之后的日期信息 。 后4个byte存储 一天内的时间信息,Datetime 中的时间可以精确到1/3 millisecond 。DateTime类型支持的数据范围是:1753年1月1日 至 9999年12月31日 。为什么是1753年呢?从技术角度完全可以支持更早的日期 。1753年的限制主要是从Julian到格林尼治时间的转换 。 SmallDateTime类型使用 4byte 类型的,前两个byte存储从1900年1月1日至今的日期,后两个byte 可以精确到minute 存储时间信息 。SmallDateTime 类型表示的数据范围为:1900-1-1至 2079-6-1. 二、如何使用DateTime DateTime的使用是比较复杂的一件事情 。如何正确的表示 日期呢? 当输入如“20060611 23:59:59:59:999”这样一个不能精确表示的内容时,会发生什么呢?怎样将日期和时间分开呢?接下来将会对这些问题进行讨论 。 1.Literals 在T-SQL中表示一个DateTime内容的输入,是一件非常tricky(不知道怎么翻译)的事情 。在一个需要DateTime类型的Insert 或者Update语句中,输入一个字符串表示日期内容时,数据库系统会隐式完成数据类型之间的转换 。当然,当存在多个操作数时,操作直接的优先级取决于操作数的数据类型 。DateTime类型的优先级要高于String类型 。当DateTime类型数据和Stirng类型数据进行比较时,String类型隐式转换为DateTime类型 。 在表示DateTime类型数据时,存在着不同的转换,这样增加了事情的复杂性 。例如:“02/12/06” 对于不同的人有不同的含义 。在将此字符串转换为DateTime类型时,SQL Server会根据 会话的语言设置(langeage settings of session)进行相应的转换 。会话语言取决于登陆账者的默认语言 。但此设置可以通过Set Language选项进行修改 。我们也可以通过设置Set Date-Format选项,控制DateTime如何转换 。Set Language选项会隐式设置Date-Format 符合语言习惯 。 例(来自Microsoft msdn):
虽然,我们可以通过Set 选项控制DateTime类型数据的转换,但是,我们需要注意到,Set 选项会修改整个会话的语言设置 。那么,会话中依赖默认语言设置的代码,在Set language操作后,将会怎么样呢?在国际应用中,关于这方面的考虑是非常重要的 。 因此,在编写代码时,我尽可能的书写不依赖系统设置和转换的代码 。在SQL Server中,DateTime有两种格式,不依赖于系统设置 。我比较倾向于在各个日期部分之间没有分隔符的格式,如“[yy]yymmdd [hh:mi:[ss][.mmm]]”,具体的数据如“20060312” ,“060312”,“20060312 23.59.59.999”等等 。DateFormat 和language设置不会影响此种格式的字符串 。如果需要在年份,月份等之间显示分隔符,建议使用以下格式“yyyy-mm-ddT hh:mi:dd[.mmm]”,具体的数据如:“2006-03-12T 14:23:05” 。(注,“yyyy-mm-ddT hh:mi:dd[.mmm]”格式测试下来还是依赖语言设置,不知道是否是我做的不对.) 除Set选项外,我们还可以使用Convert 方法显示转换 DateTime数据为不同的格式 。如Convert(datetime,12/02/2006,3).返回结果“2006-02-12 00:00:00.000”. 原文链接:http://www.cnblogs.com/fisher3/archive/2011/03/27/1996815.html |