datetime2 (Transact-SQL)
定义结合了 24 小时制时间的日期。 可将 datetime2 视作现有 datetime 类型的扩展,其数据范围更大,默认的小数精度更高,并具有可选的用户定义的精度。
datetime2 说明
属性 |
值 |
---|---|
语法 |
datetime2 [ (fractional seconds precision) ] |
用法 |
DECLARE @MyDatetime2 datetime2(7) CREATE TABLE Table1 ( Column1 datetime2(7) ) |
默认的字符串文字格式 (用于下级客户端) |
YYYY-MM-DD hh:mm:ss[.fractional seconds] 有关详细信息,请参阅后面的“下级客户端的向后兼容性”部分。 |
日期范围 |
0001-01-01 到 9999-12-31 公元元年 1 月 1 日到公元 9999 年 12 月 31 日 |
时间范围 |
00:00:00 到 23:59:59.9999999 |
时区偏移量范围 |
无 |
各元素的范围 |
YYYY 是一个四位数,范围从 0001 到 9999,表示年份。 MM 是一个两位数,范围从 01 到 12,它表示指定年份中的月份。 DD 是一个两位数,范围为 01 到 31(具体取决于月份),它表示指定月份中的某一天。 hh 是一个两位数,范围从 00 到 23,它表示小时。 mm 是一个两位数,范围从 00 到 59,它表示分钟。 ss 是一个两位数,范围从 00 到 59,它表示秒钟。 n* 代表 0 到 7 位数字,范围从 0 到 9999999,它表示秒小数部分。 |
字符长度 |
最低 19 位 (YYYY-MM-DD hh:mm:ss ),最高 27 位 (YYYY-MM-DD hh:mm:ss.0000000) |
精度、小数位数 |
0 至 7 位,准确度为 100ns。 默认精度为 7 位数。 |
存储大小 |
精度小于 3 时为 6 个字节;精度为 3 和 4 时为 7 个字节。 所有其他精度则需要 8 个字节。 |
精确度 |
100 纳秒 |
默认值 |
1900-01-01 00:00:00 |
日历 |
公历 |
用户定义的秒的小数部分精度 |
有 |
时区偏移量感知和保留 |
无 |
夏时制感知 |
无 |
有关数据类型元数据,请参阅 sys.systypes (Transact-SQL) 或 TYPEPROPERTY (Transact-SQL)。 某些日期和时间数据类型的精度和小数位数是可变的。 若要获取列的精度和小数位数,请参阅 COLUMNPROPERTY (Transact-SQL)、COL_LENGTH (Transact-SQL) 或 sys.columns (Transact-SQL)。
datetime2 支持的字符串文字格式
以下各表列出了适用于 datetime2 的支持的 ISO 8601 和 ODBC 字符串文字格式。 有关 datetime2 日期和时间部分的字母、数字、未分隔和时间格式的信息,请参阅date (Transact-SQL)和time (Transact-SQL)。
ISO 8601 |
说明 |
---|---|
YYYY-MM-DDThh:mm:ss[. nnnnnnn] YYYY-MM-DDThh:mm:ss[. nnnnnnn] |
此格式不受 SET LANGUAGE 和 SET DATEFORMAT 会话区域设置的影响。 包括在字符串内的 T、冒号 (:) 和句点 (.),例如“2007-05-02T19:58:47.1234567”。 |
ODBC |
说明 |
---|---|
{ ts 'yyyy-mm-dd hh:mm:ss[.fractional seconds]' } |
特定于 ODBC API:
|
对 ANSI 和 ISO 8601 的遵从性
datetime2 符合日期和时间的 ANSI 和 ISO 8601 标准。
下级客户端的向后兼容性
某些下级客户端不支持 time、date、datetime2 和 datetimeoffset 等数据类型。 下表显示了 SQL Server 上级实例与下级客户端之间的类型映射。
SQL Server 2012 数据类型 |
传递给下级客户端的默认字符串文字格式 |
下级 ODBC |
下级 OLEDB |
下级 JDBC |
下级 SQLCLIENT |
---|---|---|---|---|---|
time |
hh:mm:ss[. nnnnnnn] |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
date |
YYYY-MM-DD |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
datetime2 |
YYYY-MM-DD hh:mm:ss[. nnnnnnn] |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
datetimeoffset |
YYYY-MM-DD hh:mm:ss[. nnnnnnn] [+|-]hh:mm |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
转换日期和时间数据
当转换为日期和时间数据类型时,SQL Server 将会拒绝它无法识别为日期或时间的所有值。 有关对日期和时间数据使用 CAST 和 CONVERT 函数的信息,请参阅 CAST 和 CONVERT (Transact-SQL)
将 datetime2 数据类型转换为其他日期和时间类型
下表介绍当 datetime2 数据类型转换为其他日期和时间数据类型时发生的情况。
要转换成的数据类型 |
转换详细信息 |
---|---|
date |
复制年、月、日。 下面的代码显示将 datetime2(4) 值转换为 date 值的结果。
|
time(n) |
如果小数位数相同,则复制小时、分钟、秒和秒的小数部分;如果小数位数不同,则向上舍入。 下面的代码显示将 datetime2(4) 值转换为 time(3) 值的结果。
|
datetime |
复制日期和时间值。 当 datetime(n) 值的小数部分精度大于三位时,该值将被截断。 下面的代码显示将 datetime2 值转换为 datetime 值的结果。
|
smalldatetime |
复制日期和小时。 将秒数向上舍入到分钟,然后将秒数设置为 0。 下面的代码显示将 datetime2 值转换为 smalldatetime 值的结果。
|
datetimeoffset(n) |
datetime2(n) 值复制到 datetimeoffset(n) 值。 时区偏移量设置为 +00:0。 当 datetime2(n) 值的精度大于 datetimeoffset(n) 值的精度时,该值将被向上舍入,以适合目标精度。 下面的代码显示将 datetime2(5) 值转换为 datetimeoffset(3) 值的结果。
|
将字符串文字转换为 datetime2
如果字符串所有部分的格式均有效,则允许从字符串文字转换为日期和时间类型。 否则,将引发运行时错误。 从日期和时间类型向字符串文字进行的未指定样式的隐式转换或显式转换将采用当前会话的默认格式。 下表显示用于将字符串文字转换为 datetime2 数据类型的规则。
输入字符串文字 |
datetime2(n) |
---|---|
ODBC DATE |
ODBC 字符串文字映射到 datetime 数据类型。 从 ODBC DATETIME 文字到 datetime2 类型的任何赋值操作都会导致在 datetime 与此类型之间按照转换规则的定义进行隐式转换。 |
ODBC TIME |
请参阅前面的 ODBC DATE 规则。 |
ODBC DATETIME |
请参阅前面的 ODBC DATE 规则。 |
仅 DATE |
TIME 部分默认为 00:00:00。 |
仅 TIME |
DATE 部分默认为 1900-1-1。 |
仅 TIMEZONE |
提供默认值。 |
DATE + TIME |
无庸赘述 |
DATE + TIMEZONE |
不允许。 |
TIME + TIMEZONE |
DATE 部分默认为 1900-1-1。 忽略 TIMEZONE 输入。 |
DATE + TIME + TIMEZONE |
将使用本地 DATETIME。 |
示例
下例比较了将一个字符串分别转换为各种 date 和 time 数据类型所产生的结果。
SELECT
CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time'
,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date'
,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS
'smalldatetime'
,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime'
,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS
'datetime2'
,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS
'datetimeoffset';
下面是结果集:
数据类型 |
输出 |
---|---|
time |
12:35:29. 1234567 |
date |
2007-05-08 |
smalldatetime |
2007-05-08 12:35:00 |
datetime |
2007-05-08 12:35:29.123 |
datetime2 |
2007-05-08 12:35:29. 1234567 |
datetimeoffset |
2007-05-08 12:35:29.1234567 +12:15 |