Sql Server中的Time数据类型的精度和标度意味着什么?

时间:2017-01-05 10:30:51

标签: sql-server

创建TIME数据类型时,SQL Server似乎默认为time(7)MSDN表示精度和标度的范围可以从(8,0)到(16,8)。

现在,小时(00-23),分钟(00-59)和秒(00-59)每个最多可以有两位数,因此它们的精度不能超过6。如果我们在方程中加上毫秒(000-999),那么精度可以达到9.没有小数点,所以scale应该总是为零。

那么像(8,0)或(16,8)这样的值对于精度(除非精确计算小时,分钟和秒之间的冒号分隔符)和比例是什么意思?精度不应该只有9(如果我们计算冒号则为12)并且比例始终为零?如何从可用的(0-7)值中选择时间数据类型的精度?

2 个答案:

答案 0 :(得分:3)

time(和datetime2)中,精度由比例推断。您作为用户只能选择比例(即第二小数位数),然后给出精度。这仅控制部分秒数,例如(0)仅为完整秒数,(3)为您提供毫秒分辨率,(7) 100ns分辨率。

精度是给定比例的(推断的)字符数,包括冒号和小数点分隔符。因此,对于(0),这会产生字符串表示形式,例如hh:mm:ss(8个字符),而(3)会产生hh:mm:ss.fff(12个字符)和(7)hh:mm:ss.fffffff(16个字符)。这对应于您链接到的MSDN页面表中给出的数字。

答案 1 :(得分:1)

运行:

DECLARE @timeval AS TIME(7) = '12:34:56.1234567';

SELECT  @timeval Value16_7Precision,
        LEFT(CAST(@timeval AS NVARCHAR(20)), 16) First16 ,
        LEFT(CAST(@timeval AS NVARCHAR(20)), 9) First9 ,
        RIGHT(CAST(@timeval AS NVARCHAR(20)), 7) Last7;

要得到这个:

Value16_7Precision  First16             First9      Last7
12:34:56.1234567    12:34:56.1234567    12:34:56.   1234567

对于TIME(0) = (8,0),仅考虑前8个字符:12:34:56