相关文章推荐
踏实的胡萝卜  ·  Sql ...·  1 周前    · 
大力的西瓜  ·  sql ...·  5 天前    · 
一直单身的匕首  ·  backdrop-filter - ...·  2 月前    · 
难过的春卷  ·  cover-view设置overflow: ...·  6 月前    · 

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric 中的 SQL 终结点 Microsoft Fabric 中的仓库

定义一天中的某个时间。 此时间不能感知时区且基于 24 小时制。

使用 Informatica 连接器为 PDW 客户提供 Informatica 信息。

time 说明

fractional seconds scale 为秒的小数部分指定数字的位数。

这可以是从 0 到 7 的整数。 对于 Informatica,这可以是从 0 到 3 的整数。

默认小数位数为 7 (100ns)。

在 Microsoft Fabric 中,它可以是 0 到 6 的整数,没有默认值。 必须在 Microsoft Fabric 中指定精度。 默认的字符串文字格式

(用于下级客户端) 对于 Informatica,为 hh:mm:ss[.nnnnnnn])

有关详细信息,请参阅 下级客户端的后向兼容性 部分。 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 毫秒。 100 纳秒(Informatica 中为 1 毫秒) 00:00:00

此值用作从 date 隐式转换到datetime2 或 datetimeoffset 时追加的时间部分 。 用户定义的秒的小数部分精度 时区偏移量感知和保留 夏时制感知 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 后又过了二十又十分之一秒。

对 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 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)

将 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)';  
--Results  
--time(3)      time(4)  
-------------- -------------  
--12:34:54.124 12:34:54.1237  
--(1 row(s) affected)  

如果转换到“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';  
--Result  
--@time         @datetime  
--------------- -----------------------  
--12:15:04.1237 1900-01-01 12:15:04.123  
--(1 row(s) affected)  

转换到 smalldatetime 时,日期设置为“1900-01-01”,小时和分钟值向上舍入。 秒和秒的小数部分设置为 0。 下面的代码显示将 time(4) 值转换为 smalldatetime 值的结果。

-- Shows rounding up of the minute value.  
DECLARE @time time(4) = '12:15:59.9999';   
DECLARE @smalldatetime smalldatetime= @time;    
SELECT @time AS '@time', @smalldatetime AS '@smalldatetime';   
--Result  
@time            @smalldatetime  
---------------- -----------------------  
12:15:59.9999    1900-01-01 12:16:00--  
--(1 row(s) affected)  
-- Shows rounding up of the hour value.  
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  
(1 row(s) affected)  

如果转换到 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';  
--Result  
--@time         @datetimeoffset  
--------------- ------------------------------  
--12:15:04.1237 1900-01-01 12:15:04.124 +00:00  
--(1 row(s) affected)  

转换到 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';  
--Result  
--@datetime2              @time  
------------------------- -------------  
--1900-01-01 12:15:04.124 12:15:04.1237  
--(1 row(s) affected)  

将字符串文字转换为 time(n)

如果字符串所有部分的格式均有效,则允许从字符串文字转换为日期和时间类型。 否则,将引发运行时错误。 从日期和时间类型向字符串文字进行的未指定样式的隐式转换或显式转换将采用当前会话的默认格式。 下表显示用于将字符串文字转换为 time 数据类型的规则

输入字符串文字 ODBC DATE ODBC 字符串文字映射到 datetime 数据类型。 从 ODBC DATETIME 文字到 time 类型的任何赋值操作都会导致在 datetime 与此类型之间按照转换规则的定义进行隐式转换。 ODBC TIME 请参阅上面的 ODBC DATE 规则。 ODBC DATETIME 请参阅上面的 ODBC DATE 规则。 仅 DATE 提供默认值。 仅 TIME 仅 TIMEZONE 提供默认值。 DATE + TIME 使用输入字符串的 TIME 部分。 DATE + TIMEZONE TIME + TIMEZONE 使用输入字符串的 TIME 部分。 DATE + TIME + TIMEZONE 将使用本地 DATETIME 的 TIME 部分。

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';