datetime
用于定义一个与采用24小时制并带有秒小数部分的一日时间组合的日期。
注意
对于性的工作,请使用time、 date、 datetime2 和datetimeoffset数据类型。这些数据类型符合SQL标准。它们更便于移植。time、datetime2和datetimeoffset提供更高精度的秒数。datetimeoffset为全局部署的应用提供时区支持。
datetime说明
属性 | 值 |
---|---|
语法 | datetime |
用法 | DECLARE @MyDatetime datetime CREATE TABLE Table1 ( Column1 datetime ) |
默认的字符串文字格式 (用于下级客户端) | 不适用 |
日期范围 | 1753 年 1 月 1 日到 9999 年 12 月 31 日 |
时间范围 | 00:00:00 到 23:59:59.997 |
时区偏移量范围 | 无 |
各元素的范围 | YYYY 是表示年份的四位数字,范围为 1753 到 9999。 MM 是表示指定年份中的月份的两位数字,范围为 01 到 12。 DD 是表示指定月份中的某一天的两位数字,范围为 01 到 31(最高值取决于相应月份)。 hh 是表示小时的两位数字,范围为 00 到 23。 mm 是表示分钟的两位数字,范围为 00 到 59。 ss 是表示秒钟的两位数字,范围为 00 到 59。 n* 为一个 0 到 3 位的数字,范围为 0 到 999,表示秒的小数部分。 |
字符长度 | 最低 19 位到最高 23 位 |
存储大小 | 8 字节 |
精确度 | 舍入到 .000、.003 或 .007 秒三个增量。 |
默认值 | 1900-01-01 00:00:00 |
日历 | 公历(不包括完整的年份范围。) |
用户定义的秒的小数部分精度 | 否 |
时区偏移量感知和保留 | 否 |
夏时制感知 | 否 |
以下各表列出了 datetime 支持的字符串文字格式。datetime 字符串文字位于单引号 (') 中,例如 'string_literaL',但 ODBC 除外。如果环境不是 us_english,则字符串文字应采用 N'string_literaL' 格式。
数值 | 说明 |
---|---|
日期格式: [0]4/15/[19]96 -- (mdy) [0]4-15-[19]96 -- (mdy) [0]4.15.[19]96 -- (mdy) [0]4/[19]96/15 -- (myd) 15/[0]4/[19]96 -- (dmy) 15/[19]96/[0]4 -- (dym) [19]96/15/[0]4 -- (ydm) [19]96/[0]4/15 -- (ymd) 时间格式: 14:30 14:30[:20:999] 14:30[:20.9] 4am 4 PM | 您可以指定日期数据,其中月份也通过数值指定。例如,5/20/97 表示 1997 年 5 月 20 日。采用数值日期格式时,可在字符串中使用斜线 (/)、连字符 (-) 或句点 (.)作为分隔符来指定月、日、年。此字符串必须采用以下格式:
当语言设置为 us_english 时,默认的日期顺序是 mdy。可以使用 SET DATEFORMAT 语句更改日期顺序。 SET DATEFORMAT 的设置决定了如何解释日期值。如果顺序和设置不匹配,这些值将由于超出范围而不会被解释成日期,或者被错误地解释。例如,12/10/08 可以解释成六个不同的日期,具体解释为哪一日期取决于 DATEFORMAT 的设置。四位数字的年份被解释为年。 |
字母 | 说明 |
---|---|
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] | 您可以指定一个日期数据,其中使用完整的月份名称来指定月份。例如,月份用英语 April 或使用其缩写 Apr 指定;逗号是可选的,且忽略大小写。 下面是使用字母日期格式的一些准则:
当按字母形式指定月份时,SET DATEFORMAT 会话设置不起作用。 |
ISO 8601 | 说明 |
---|---|
YYYY-MM-DDThh:mm:ss[.mmm] YYYYMMDDThh:mm:ss[.mmm] | 示例:
若要使用 ISO 8601 格式,必须按此格式指定每一个元素。这也包括显示在此格式中的 T、冒号 (:)和句点 (.)。 方括号表示秒小数部分是可选的。时间部分按 24 小时制指定。 T 表示其后是 datetime 值的时间部分。 使用 ISO 8601 格式的优点是它是一种国际标准,不会产生模糊的指定。同时,此格式不受 SET DATEFORMAT 或 SET LANGUAGE设置的影响。 |
未分隔的 | 说明 |
---|---|
YYYYMMDD hh:mm:ss[.mmm] |
ODBC | 说明 |
---|---|
{ ts '1998-05-02 01:23:56.123' } { d '1990-10-02' } { t '13:33:41' } | ODBC API 用于定义转义序列以表示日期和时间值,ODBC 称之为时间戳数据。Microsoft OLE DB Provider for SQL Server 所支持的 OLE DB 语言定义 (DBGUID-SQL) 也支持这种 ODBC 时间戳格式。使用 ADO、OLE DB 和基于 ODBC 的 API 的应用程序可以使用这种 ODBC 时间戳格式来表示日期和时间。 ODBC 时间戳的转义序列格式为:{ literal_type 'constant_value' }:
|
如下表所示,将 datetime 值舍入到 .000、.003、或 .007 秒的增量。
用户指定的值 | 系统存储的值 |
---|---|
01/01/98 23:59:59.999 | 1998-01-02 00:00:00.000 |
01/01/98 23:59:59.995 01/01/98 23:59:59.996 01/01/98 23:59:59.997 01/01/98 23:59:59.998 | 1998-01-01 23:59:59.997 |
01/01/98 23:59:59.992 01/01/98 23:59:59.993 01/01/98 23:59:59.994 | 1998-01-01 23:59:59.993 |
01/01/98 23:59:59.990 01/01/98 23:59:59.991 | 1998-01-01 23:59:59.990 |
下例比较了将一个字符串分别转换为各种 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 |
datetime2 (Transact-SQL)
定义结合了 24 小时制时间的日期。可将 datetime2 视作现有 datetime 类型的扩展,其数据范围更大,默认的小数精度更高,并具有可选的用户定义的精度。
有关所有 Transact-SQL 日期和时间数据类型及函数的概述,请参阅日期和时间函数 (Transact-SQL)。有关日期和时间数据类型及函数共有的信息和示例,请参阅使用日期和时间数据。
属性 | 值 |
---|---|
语法 | 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 的支持的 ISO 8601 和 ODBC 字符串文字格式。有关 datetime2 日期和时间部分的字母、数字、未分隔和时间格式的信息,请参阅日期 (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:
|
下例比较了将一个字符串转换为各种 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 |
datetimeoffset (Transact-SQL)
用于定义一个与采用 24 小时制并可识别时区的一日内时间相组合的日期。
有关所有 Transact-SQL 日期和时间数据类型及函数的概述,请参阅日期和时间函数 (Transact-SQL)。有关日期和时间数据类型及函数共有的信息和示例,请参阅使用日期和时间数据。
属性 | 值 |
---|---|
语法 | datetimeoffset [ (fractional seconds precision) ] |
用法 | DECLARE @MyDatetimeoffset datetimeoffset(7) CREATE TABLE Table1 ( Column1 datetimeoffset(7) ) |
默认字符串文字格式(用于下级客户端) | YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{+|-}hh:mm] 有关详细信息,请参阅使用日期和时间数据的“下级客户端的向后兼容性”部分。 |
日期范围 | 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,它表示秒的小数部分。 hh 是两位数,范围为 -14 到 +14。 mm 是两位数,范围为 00 到 59。 |
字符长度 | 最低 26 位 (YYYY-MM-DD hh:mm:ss {+|-}hh:mm) 到最高 34 位 (YYYY-MM-DD hh:mm:ss.nnnnnnn {+|-}hh:mm) |
精度、小数位数 |
指定的小数位数
结果 (精度, 小数位数)
列长度(以字节为单位)
秒的小数部分精度
datetimeoffset
(34,7)
10
7
datetimeoffset(0)
(26,0)
8
0-2
datetimeoffset(1)
(28,1)
8
0-2
datetimeoffset(2)
(29,2)
8
0-2
datetimeoffset(3)
(30,3)
9
3-4
datetimeoffset(4)
(31,4)
9
3-4
datetimeoffset(5)
(32,5)
10
5-7
datetimeoffset(6)
(33,6)
10
5-7
datetimeoffset(7)
(34,7)
10
5-7
|
存储大小 | 默认值为 10 个字节的固定大小,默认的秒的小数部分精度为 100ns。 |
精确度 | 100 纳秒 |
默认值 | 1900-01-01 00:00:00 00:00 |
日历 | 公历 |
用户定义的秒的小数部分精度 | 是 |
时区偏移量感知和保留 | 是 |
夏时制感知 | 否 |
下表列出了 datetimeoffset 支持的 ISO 8601 字符串文字格式。有关 datetimeoffset 日期和时间部分的字母、数值、未分隔的字符串文字格式和时间格式的信息,请参阅 日期 (Transact-SQL) 和 time (Transact-SQL)。
ISO 8601 | 说明 |
---|---|
YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] | 这两种格式不受 SET LANGUAGE 和 SET DATEFORMAT 会话的区域设置的影响。datetimeoffset 与 datetime 部分之间不允许有空格。 |
YYYY-MM-DDThh:mm:ss[.nnnnnnn]Z (UTC) | 这种遵从 ISO 定义的格式表明 datetime 部分应采用协调世界时 (UTC) 表示。例如,1999-12-12 12:30:30.12345 -07:00 应表示为 1999-12-12 19:30:30.12345Z。 |
时区偏移量指定某个 time 或 datetime 值相对于 UTC 的时区偏移量。时区偏移量可以表示为 [+|-] hh:mm:
-
hh 是两位数,范围为 00 到 14,表示时区偏移量中的小时数。
-
mm 是两位数,范围为 00 到 59,表示时区偏移量中的额外分钟数。
-
时区偏移量中必须包含 +(加)或 –(减)号。这两个符号表示是在 UTC 时间的基础上加上还是从中减去时区偏移量以得出本地时间。时区偏移量的有效范围为 -14:00 到 +14:00。
时区偏移量的范围遵循 XSD 架构定义的 W3C XML 标准,与 SQL 2003 标准定义(12:59 到 +14:00)略有不同。
可选的类型参数 fractional seconds precision 指定了秒小数部分的位数。该值可以是一个 0 到 7(100 纳秒)的整数。默认 fractional seconds precision 为 100ns(秒小数部分有 7 位)。
此数据存储在数据库中,并以与 UTC 相同的方式在服务器中进行处理、比较、排序和索引。时区偏移量将保留在数据库中以供检索。
给定时区偏移量将假定为可以识别夏时制时间 (DST),并会针对 DST 期间内的任何给定 datetime 进行调整。
对于 datetimeoffset 类型,在插入、更新、转换或赋值操作中将验证 UTC 和本地(相对于一致的或转换的时区偏移量)datetime 值。如果检测到任何无效的 UTC 或本地(相对于一致的或转换的时区偏移量)datetime 值,将引发一个无效值错误。例如,9999-12-31 10:10:00 在 UTC 中有效,但在本地时间中会溢出时区偏移量 +13:50。
下例比较了将一个字符串分别转换为各种 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' ,CAST('2007-05-08 12:35:29.1234567+12:15' AS datetimeoffset(7)) AS 'datetimeoffset IS08601';
下面是结果集:
数据类型 | 输出 |
---|---|
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 |
smalldatetime (Transact-SQL)
定义结合了一天中的时间的日期。此时间为 24 小时制,秒始终为零 (:00),并且不带秒小数部分。
注意 |
---|
对于新的工作,请使用 time、date、datetime2 和 datetimeoffset 数据类型。这些类型符合 SQL 标准。它们更易于移植。time、datetime2 和 datetimeoffset提供更高精度的秒数。datetimeoffset 为全局部署的应用程序提供时区支持。 |
有关所有 Transact-SQL 日期和时间数据类型及函数的概述,请参阅日期和时间函数 (Transact-SQL)。有关日期和时间数据类型及函数共有的信息和示例,请参阅使用日期和时间数据。
语法 | smalldatetime |
用法 | DECLARE @MySmalldatetime smalldatetime CREATE TABLE Table1 ( Column1 smalldatetime ) |
默认的字符串文字格式 (用于下级客户端) | 不适用 |
日期范围 | 1900-01-01 到 2079-06-06 1900 年 1 月 1 日到 2079 年 6 月 6 日 |
时间范围 | 00:00:00 到 23:59:59 2007-05-09 23:59:59 将舍入为 2007-05-10 00:00:00 |
元素范围 | YYYY 是表示年份的四位数字,范围为 1900 到 2079。 MM 是表示指定年份中的月份的两位数字,范围为 01 到 12。 DD 是表示指定月份中的某一天的两位数字,范围为 01 到 31(最高值取决于相应月份)。 hh 是表示小时的两位数字,范围为 00 到 23。 mm 是表示分钟的两位数字,范围为 00 到 59。 ss 是表示秒钟的两位数字,范围为 00 到 59。小于或等于 29.998 秒的值向下舍入为最接近的分钟数;大于或等于 29.999 秒的值向上舍入为最接近的分钟数。 |
字符长度 | 最高 19 位 |
存储大小 | 固定 4 个字节。 |
精确度 | 一分钟 |
默认值 | 1900-01-01 00:00:00 |
日历 | 公历 (不包括完整的年份范围。) |
用户定义的秒的小数部分精度 | 否 |
时区偏移量感知和保留 | 否 |
夏时制感知 | 否 |
A. 将带秒数的字符串文字转换为 smalldatetime
下例比较了将字符串文字中的秒数转换成 smalldatetime 时产生的结果。
SELECT CAST('2007-05-08 12:35:29' AS smalldatetime) ,CAST('2007-05-08 12:35:30' AS smalldatetime) ,CAST('2007-05-08 12:59:59.998' AS smalldatetime);
输入 | 输出 |
---|---|
2007-05-08 12:35:29 | 2007-05-08 12:35:00 |
2007-05-08 12:35:30 | 2007-05-08 12:36:00 |
2007-05-08 12:59:59.998 | 2007-05-08 13:00:00 |
B. 比较日期和时间数据类型
下例比较了将一个字符串分别转换为各种日期和时间数据类型时所产生的结果。
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 |
time (Transact-SQL)
定义一天中的某个时间。此时间不能感知时区且基于 24 小时制。
有关所有 Transact-SQL 日期和时间数据类型及函数的概述,请参阅日期和时间函数 (Transact-SQL)。有关日期和时间数据类型及函数共有的信息和示例,请参阅使用日期和时间数据。
属性 | 值 |
---|---|
语法 | time [ (fractional second precision) ] |
用法 | DECLARE @MyTime time(7) CREATE TABLE Table1 ( Column1 time(7) ) |
fractional seconds precision | 为秒的小数部分指定数字的位数。 这可以是从 0 到 7 的整数。 默认的小数精度是 7 (100ns)。 |
用法 | DECLARE @MyTime time(7) CREATE TABLE Table1 ( Column1 time(7) ) |
默认的字符串文字格式 (用于下级客户端) | hh:mm:ss[.nnnnnnn] 有关详细信息,请参阅使用日期和时间数据的“下级客户端的向后兼容性”部分。 |
范围 | 00:00:00.0000000 到 23:59:59.9999999 |
各元素的范围 | hh 是表示小时的两位数字,范围为 0 到 23。 mm 是表示分钟的两位数字,范围为 0 到 59。 ss 是表示秒的两位数字,范围为 0 到 59。 n* 是 0 到 7 位数字,范围为 0 到 9999999,它表示秒的小数部分。 |
字符长度 | 最小 8 位 (hh:mm:ss),最大 16 位 (hh:mm:ss.nnnnnnn) |
精度、小数位数 (用户只能指定小数位数) |
指定的小数位数
结果 (精度, 小数位数)
列长度(以字节为单位)
小数秒精度
time
(16,7)
5
7
time(0)
(8,0)
3
0-2
time(1)
(10,1)
3
0-2
time(2)
(11,2)
3
0-2
time(3)
(12,3)
4
3-4
time(4)
(13,4)
4
3-4
time(5)
(14,5)
5
5-7
time(6)
(15,6)
5
5-7
time(7)
(16,7)
5
5-7
|
存储大小 | 固定 5 个字节,是使用默认的 100ns 秒的小数部分精度时的默认存储大小。 |
精确度 | 100 纳秒 |
默认值 | 00:00:00 此值用作从 date 隐式转换到 datetime2 或 datetimeoffset 时追加的时间部分。 |
用户定义的秒的小数部分精度 | 有 |
时区偏移量感知和保留 | 无 |
夏时制感知 | 无 |
下表显示的是适用于 time 数据类型的有效字符串文字格式。
SQL Server | 说明 |
---|---|
hh:mm[:ss][:fractional seconds][AM][PM] hh:mm[:ss][.fractional seconds][AM][PM] hhAM[PM] hh AM[PM] | 如果小时值为 0,则不论是否指定了 AM,都表示午夜 (AM) 后的小时。当小时值等于 0 时,不能指定 PM。 如果 AM 和 PM 均未指定,则小时值为 01 到 11 时,表示中午以前的小时。如果指定了 AM,则这些值表示中午以前的小时。如果指定了 PM,则这些值表示中午以后的小时。 如果既未指定 AM,也未指定 PM,则小时值 12 表示始于中午的小时。如果指定了 AM,则该值表示始于午夜的小时。如果指定了 PM,则该值表示始于中午的小时。例如:12:01 是指中午过后 1 分钟,与 12:01 PM 的含义相同,而 12:01 AM 则指午夜过后 1 分钟。指定 12:01 AM 与指定 00:01 或 00:01 AM 等效。 如果未指定 AM 或 PM,则小时值 13 到 23 表示中午以后的小时。如果指定了 PM,这些值也表示中午以后的小时。如果小时值为 13 到 23,不能指定 AM。 如果小时值为 24,则该值无效。若要表示午夜,请使用 12:00 AM 或 00:00。 可以在毫秒之前加上冒号 (:) 或者句点 (.)。如果使用冒号,这个数字表示千分之一秒。如果使用句点,则单个数字表示十分之一秒,两个数字表示百分之一秒,三个数字表示千分之一秒。例如,12:30:20:1 表示到了 12:30 后又过了二十又千分之一秒;12:30:20.1 表示到了 12:30 后又过了二十又十分之一秒。 |
ISO 8601 | 说明 |
---|---|
hh:mm:ss hh:mm[:ss][.fractional seconds] |
|
ODBC | 说明 |
---|---|
{t 'hh:mm:ss[.fractional seconds]'} | 特定于 ODBC API。 在 SQL Server 2008 中的工作方式与在 SQL Server 2005 中相同。 |
A. 比较日期和时间数据类型
下例比较了将一个字符串分别转换为各种 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 |
B. 将有效的时间字符串文字插入 time(7) 列
下表列出了可插入到数据类型为 time(7) 的一个列中的不同字符串文字,以及在插入后存储到该列中的对应值。
字符串文字格式类型 | 插入的字符串文字 | 存储的 time(7) 值 | 说明 |
---|---|---|---|
SQL Server | '01:01:01:123AM' | 01:01:01.1230000 | 如果在秒的小数部分精度之前使用冒号 (:),则小数位数不能超过三位,否则将引发错误。 |
SQL Server | '01:01:01.1234567 AM' | 01:01:01.1234567 | 如果指定了 AM 或 PM,则时间以不带 AM 或 PM 文字的 24 小时格式存储 |
SQL Server | '01:01:01.1234567 PM' | 13:01:01.1234567 | 如果指定了 AM 或 PM,则时间以不带 AM 或 PM 文字的 24 小时格式存储 |
SQL Server | '01:01:01.1234567PM' | 13:01:01.1234567 | AM 或 PM 之前的空格可有可无。 |
SQL Server | '01AM' | 01:00:00.0000000 | 仅指定小时时,所有其他值均为 0。 |
SQL Server | '01 AM' | 01:00:00.0000000 | AM 或 PM 之前的空格可有可无。 |
SQL Server | '01:01:01' | 01:01:01.0000000 | 如果秒的小数部分精度未指定,则由数据类型定义的各数位均为 0。 |
ISO 8601 | '01:01:01.1234567' | 01:01:01.1234567 | 为遵从 ISO 8601,使用 24 小时格式,而非 AM 或 PM 格式。 |
ISO 8601 | '01:01:01.1234567 +01:01' | 01:01:01.1234567 | 允许输入内容中包含可选的时区差异 (TZD),但不存储它。 |
C. 将时间字符串文字插入到各种日期和时间数据类型的列中
下表中的第一列显示的是时间字符串文字,第二列显示的是日期或时间数据类型,第一列中的时间字符串文字将插入到第二列中与之对应的数据类型的数据库表列中。第三列显示的是将存储在对应数据库表列中的值。
插入的字符串文字 | 列数据类型 | 存储在列中的值 | 说明 |
---|---|---|---|
'12:12:12.1234567' | time(7) | 12:12:12.1234567 | 如果秒的小数部分精度超过为列指定的值,则字符串将被截断,且不会出错。 |
'2007-05-07' | date | NULL | 任何时间值均将导致 INSERT 语句失败。 |
'12:12:12' | smalldatetime | 1900-01-01 12:12:00 | 任何秒的小数部分精度值都将导致 INSERT 语句失败。 |
'12:12:12.123' | datetime | 1900-01-01 12:12:12.123 | 任何长于三位的秒精度都将导致 INSERT 语句失败。 |
'12:12:12.1234567' | datetime2(7) | 1900-01-01 12:12:12.1234567 | 如果秒的小数部分精度超过为列指定的值,则字符串将被截断,且不会出错。 |
'12:12:12.1234567' | datetimeoffset(7) | 1900-01-01 12:12:12.1234567 +00:00 | 如果秒的小数部分精度超过为列指定的值,则字符串将被截断,且不会出错。 |