datetime2 (Transact-SQL)

定义结合了 24 小时制时间的日期。 可将 datetime2 视作现有 datetime 类型的扩展,其数据范围更大,默认的小数精度更高,并具有可选的用户定义的精度。

适用范围:SQL Server(SQL Server 2008 至当前版本),Windows Azure SQL Database(初始版本至当前版本)。

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:

小数点右侧的数字表示秒小数部分,可指定 0 到 7 位(100 纳秒)。

对 ANSI 和 ISO 8601 的遵从性

datetime2 符合日期时间的 ANSI 和 ISO 8601 标准。

下级客户端的向后兼容性

某些下级客户端不支持 time、date、datetime2 和 datetimeoffset 等数据类型。 下表显示了 SQL Server 上级实例与下级客户端之间的类型映射。

SQL Server 数据类型

传递给下级客户端的默认字符串文字格式

下级 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

复制年、月、日。 时间部分设置为 00:00:00.000。

下面的代码显示将 date 值转换为 datetime 值的结果。

DECLARE @date date = '12-21-05';
DECLARE @datetime datetime = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
--Result
--@datetime               @date
------------------------- ----------
--2005-12-21 00:00:00.000 2005-12-21

time(n)

复制时间部分,日期部分设置为“1900-01-01”。 当 time(n) 值的小数部分精度大于三位时,该值将被截断,以适合目标精度。

下面的示例显示将 time(4) 值转换为 datetime 值的结果。

DECLARE @time time(4) = '12:10:05.1237';
DECLARE @datetime datetime = @time;
SELECT @datetime AS '@datetime', @time AS '@time';
--Result
--@datetime               @time
------------------------- -------------
--1900-01-01 12:10:05.123 12:10:05.1237
--
--(1 row(s) affected)

smalldatetime

复制小时和分钟。 秒和秒的小数部分设置为 0。

下面的代码显示将 smalldatetime 值转换为 datetime 值的结果。

DECLARE @smalldatetime smalldatetime = '12-01-01 12:32';
DECLARE @datetime datetime = @smalldatetime;
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';
--Result
--@datetime               @smalldatetime
------------------------- -----------------------
--2001-12-01 12:32:00.000 2001-12-01 12:32:00
--
--(1 row(s) affected)

datetimeoffset(n)

复制日期和时间部分。 时区被截断。 当 datetimeoffset(n) 值的小数部分精度大于三位时,该值将被截断。

下面的示例显示了将 datetimeoffset(4) 值转换为 datetime 值的结果。

DECLARE @datetimeoffset datetimeoffset(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime datetime = @datetimeoffset;
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';
--Result
--@datetime               @datetimeoffset
------------------------- ------------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +01:0
--
--(1 row(s) affected)

datetime2(n)

复制日期和时间。 当 datetime2(n) 值的小数部分精度大于三位时,该值将被截断。

下面的示例显示了将 datetime2(4) 值转换为 datetime 值的结果。

DECLARE @datetime2 datetime2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime datetime = @datetime2;
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';
--Result
--@datetime               @datetime2
------------------------- ------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
--
--(1 row(s) affected)

将字符串文字转换为 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

请参阅

参考

CAST 和 CONVERT (Transact-SQL)