创建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)值中选择时间数据类型的精度?
答案 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