适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Azure Synapse Analytics
Microsoft Fabric中的SQL分析端点
Microsoft Fabric中的仓库
Microsoft Fabric中的SQL数据库
定义一天中的某个时间。 此时间不能感知时区且基于 24 小时制。
Note
使用 Informatica 连接器为 PDW 客户提供 Informatica 信息。
时间描述
| Property | Value |
|---|---|
| Syntax | time [ (fractional second scale) ] |
| Usage | DECLARE @MyTime time(7) CREATE TABLE表1(第1列时间(7) |
| fractional seconds scale | 为秒的小数部分指定数字的位数。 这可以是从 0 到 7 的整数。 对于 Informatica,这可以是从 0 到 3 的整数。 默认小数位数为 7 (100ns)。 在 Microsoft Fabric 中,它可以是 0 到 6 的整数,没有默认值。 必须在 Microsoft Fabric 中指定精度。 |
| 默认的字符串文字格式 (用于下级客户端) |
对于 Informatica,为 hh:mm:ss[.nnnnnnn]) 有关详细信息,请参阅下级客户端的后向兼容性部分。 |
| Range | 00:00:00.0000000 到 23:59:59.9999999(对于 Informatica,为 00:00:00.000 到 23:59:59.999) |
| 元素范围 | hh 是表示小时的两位数字,范围为 0 到 23。 mm 是表示分钟的两位数字,范围为 0 到 59。 ss 是表示秒的两位数字,范围为 0 到 59。 n* 是 0 到 7 位数字,范围为 0 到 9999999,它表示秒的小数部分。 对于 Informatica,n* 是零到三位数字,范围为 0 到 999。 |
| 字符长度 | 最小 8 位 (hh:mm:ss),最大 16 位 (hh:mm:ss.nnnnnnn)。 对于 Informatica,最大值为 12 位 (hh:mm:ss.nnn)。 |
| 精准度,规模 (用户只能指定小数位数) |
请参阅下表。 |
| 存储大小 | 固定 5 个字节,是使用默认的 100ns 秒的小数部分精度时的默认存储大小。 在 Informatica 中,默认为 4 个字节,固定不变,同时秒的小数部分精度默认为 1 毫秒。 |
| Accuracy | 100 纳秒(Informatica 中为 1 毫秒) |
| 默认值 | 00:00:00 此值用作从 date 隐式转换到datetime2 或 datetimeoffset 时追加的时间部分。 |
| 用户定义的秒的小数部分精度 | Yes |
| 时区偏移量感知和保留 | No |
| 夏时制感知 | No |
| 指定的缩放 | 结果 (精度, 小数位数) | 列长度(以字节为单位) | Fractional seconds 精准率 |
|---|---|---|---|
| time | (16,7)[Informatica 中为 (12,3)] | 5(Informatica 中为 4) | 7(Informatica 中为 3) |
| 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 |
| 时间(4)* | (13,4) | 4 | 3-4 |
| 时间(5)* | (14,5) | 5 | 5-7 |
| 时间(6)* | (15,6) | 5 | 5-7 |
| 时间(7)* + | (16,7) | 5 | 5-7 |
* 在 Informatica 中不受支持。
+ 在 Microsoft Fabric 中不受支持。
time 支持的字符串文字格式
下表显示的是适用于 time 数据类型的有效字符串文字格式。
| SQL Server | Description |
|---|---|
| hh:mm[:ss][:分数秒][AM][PM] hh:mm[:ss][.分数秒][AM][PM] hhAM[PM] 哈哈 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 | Notes |
|---|---|
| hh:mm:ss hh:mm[:ss][.分数秒] |
hh 是两位数,介于 0 和 23 范围之间,表示时区偏移小时数。 mm 是两位数,范围为 0 到 59,它表示时区偏移量中的额外分钟数。 |
| ODBC | Notes |
|---|---|
| {t 'hh:mm:ss[.fractional seconds]'} | 特定于 ODBC API。 |
对 ANSI 和 ISO 8601 标准的遵从性
为满足向后兼容的需要以及与现有日期和时间类型保持一致,不支持 ISO 8601(5.3.2 和 5.3)规定的如下用法:用 24 点表示午夜和允许大于 59 的闰秒。
默认字符串文字格式(用于下级客户端)将遵照 SQL 标准格式(定义为 hh:mm:ss[.nnnnnnn])。 这种格式类似于 ISO 8601 对不包含秒小数部分的 TIME 的定义。
下级客户端的向后兼容性
某些下级客户端不支持 time、time、datetime2 和 datetimeoffset 数据类型。 下表显示了 SQL Server 上级实例与下级客户端之间的类型映射。
| SQL Server 数据类型 | 传递给下级客户端的默认字符串文字格式 | 下层 ODBC | 下层 OLEDB | 下层 JDBC | 下层 SQLCLIENT |
|---|---|---|---|---|---|
| time | hh:mm:ss[.nnnnnnn] | SQL_WVARCHAR 或 SQL_VARCHAR | DBTYPE_WSTRor DBTYPE_STR | Java.sql.String | String 或 SqString |
| date | YYYY-MM-DD | SQL_WVARCHAR 或 SQL_VARCHAR | DBTYPE_WSTRor DBTYPE_STR | Java.sql.String | String 或 SqString |
| datetime2 | YYYY-MM-DD hh:mm:ss[.nnnnnnn] | SQL_WVARCHAR 或 SQL_VARCHAR | DBTYPE_WSTRor DBTYPE_STR | Java.sql.String | String 或 SqString |
| datetimeoffset | YYYY-MM-DD hh:mm:ss[.nnnnnnnnn] [+|-]hh:mm | SQL_WVARCHAR 或 SQL_VARCHAR | DBTYPE_WSTRor DBTYPE_STR | Java.sql.String | String 或 SqString |
转换日期和时间数据
当转换为日期和时间数据类型时,SQL Server 将会拒绝它无法识别为日期或时间的所有值。 有关对日期和时间数据使用 CAST 和 CONVERT 函数的信息,请参阅 CAST 和 CONVERT (Transact-SQL)
将 time(n) 数据类型转换为其他日期和时间类型
本部分介绍当 time 数据类型转换为其他日期和时间数据类型时发生的情况。
转换到 time(n) 时,会复制小时、分钟和秒数。 当目标精度小于源精度时,将对秒的小数部分进行向上舍入,以适合目标精度。 下面的示例显示了将 time(4) 值转换为 time(3) 值的结果。
DECLARE @timeFrom TIME(4) = '12:34:54.1237';
DECLARE @timeTo TIME(3) = @timeFrom;
SELECT @timeTo AS 'time(3)', @timeFrom AS 'time(4)';
结果集如下。
time(3) time(4)
------------ -------------
12:34:54.124 12:34:54.1237
如果转换到“date”,转换失败,并引发错误消息 206:“操作数类型冲突: date 与 time 不兼容”。
转换到 datetime 时,会复制小时、分钟和秒数,且日期部分设为“1900-01-01”。 当 time(n) 值的秒的小数部分精度大于三位时,datetime 结果将被截断。 下面的代码显示将 time(4) 值转换为 datetime 值的结果。
DECLARE @time TIME(4) = '12:15:04.1237';
DECLARE @datetime DATETIME = @time;
SELECT @time AS '@time', @datetime AS '@datetime';
结果集如下。
@time @datetime
------------- -----------------------
12:15:04.1237 1900-01-01 12:15:04.123
转换到 smalldatetime 时,日期设置为“1900-01-01”,小时和分钟值向上舍入。 秒和秒的小数部分设置为 0。 下面的代码显示将 time(4) 值转换为 smalldatetime 值的结果。
显示分钟值的舍入:
DECLARE @time TIME(4) = '12:15:59.9999';
DECLARE @smalldatetime SMALLDATETIME = @time;
SELECT @time AS '@time', @smalldatetime AS '@smalldatetime';
结果集如下。
@time @smalldatetime
---------------- -----------------------
12:15:59.9999 1900-01-01 12:16:00--
显示小时值的舍入:
DECLARE @time TIME(4) = '12:59:59.9999';
DECLARE @smalldatetime SMALLDATETIME = @time;
SELECT @time AS '@time', @smalldatetime AS '@smalldatetime';
结果集如下。
@time @smalldatetime
---------------- -----------------------
12:59:59.9999 1900-01-01 13:00:00
如果转换到 datetimeoffset(n),则日期设置为“1900-01-01”,且复制时间。 时区偏移量设置为 +00:00。 当 time(n) 值秒的小数部分精度大于 datetimeoffset(n) 值的精度时,将对值进行向上舍入以适合精度。 下面的示例显示将 time(4) 值转换为 datetimeoffset(3) 类型的结果。
DECLARE @time TIME(4) = '12:15:04.1237';
DECLARE @datetimeoffset DATETIMEOFFSET(3) = @time;
SELECT @time AS '@time', @datetimeoffset AS '@datetimeoffset';
结果集如下。
@time @datetimeoffset
------------- ------------------------------
12:15:04.1237 1900-01-01 12:15:04.124 +00:00
转换到 datetime2(n) 时,日期设置为“1900-01-01”,复制时间部分,时区偏移量设置为 00:00。 当 datetime2(n) 值秒的小数部分精度大于 time(n) 值时,将对值进行向上舍入以适合精度。 下面的示例显示了将 time(4) 值转换为 datetime2(2) 值的结果。
DECLARE @time TIME(4) = '12:15:04.1237';
DECLARE @datetime2 DATETIME2(3) = @time;
SELECT @datetime2 AS '@datetime2', @time AS '@time';
结果集如下。
@datetime2 @time
----------------------- -------------
1900-01-01 12:15:04.124 12:15:04.1237
将字符串文字转换为 time(n)
如果字符串所有部分的格式均有效,则允许从字符串文字转换为日期和时间类型。 否则,将引发运行时错误。 从日期和时间类型向字符串文字进行的未指定样式的隐式转换或显式转换将采用当前会话的默认格式。 下表显示用于将字符串文字转换为 time 数据类型的规则。
| 输入字符串文字 | 转换规则 |
|---|---|
| ODBC日期 | ODBC 字符串文字映射到 datetime 数据类型。 从 ODBC DATETIME 文本转换为 时间 类型的任何赋值作都会导致 日期/时间 与转换规则定义的此类型之间的隐式转换。 |
| ODBC时间 | 请参阅上面的 ODBC DATE 规则。 |
| ODBC约会时间 | 请参阅上面的 ODBC DATE 规则。 |
| 仅限日期 | 提供默认值。 |
| 只有时间 | Trivial |
| 仅限时区 | 提供默认值。 |
| 日期+时间 | 使用输入字符串的 TIME 部分。 |
| 日期 + 时区 | 不允许。 |
| 时间+时区 | 使用输入字符串的 TIME 部分。 |
| 日期 + 时间 + 时区 | 将使用本地 DATETIME 的 TIME 部分。 |
Examples
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';
| 数据类型 | Output |
|---|---|
| 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) 值 | Description |
|---|---|---|---|
| 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 | '凌晨1点' | 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. 将时间字符串文字插入到各种日期和时间数据类型的列中
下表中的第一列显示的是时间字符串文字,第二列显示的是日期或时间数据类型,第一列中的时间字符串文字将插入到第二列中与之对应的数据类型的数据库表列中。 第三列显示的是将存储在对应数据库表列中的值。
| 插入的字符串文字 | 列数据类型 | 存储在列中的值 | Description |
|---|---|---|---|
| '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 | 如果秒的小数部分精度超过为列指定的值,则字符串将被截断,且不会出错。 |