Новый тип TIME содержит в себе значение времени, но уже с
определенной пользователем точностью, которая влияет на хранение дробных частей
секунды.
Значение точности
может варьироваться от 0 до 7, указывая количество цифр в дробной части
секунды. По умолчанию, точность TIME(7), что значит,
что секунды в этом типе данных будут храниться с дробной частью в диапазоне от
.0000000 до .9999999.
Тип TIME хранится как INTEGER с варьирующимся размером, который напрямую зависит от точности. При
точности 0-2, этот тип хранится в виде 3-байтового INT, 3-4 как 4-байтовый INT, а для точности 5-7 выделяется 5-байтовый
INT.
Значение точности
используется, для варьирования гранулярности при просчете времени после полуночи, : от 1 секунды до
100 наносекунд.
К примеру, если
значение времени хранится в поле с типом Time и указанной точностью n, время в секундах
после полуночи в будет рассчитано таким
образом: t / 10n.
Далее следует
краткое изложение хранения и точности TIME:
|
Точность
|
Хранение (байт)
|
Секунд
|
Миллисекунд
|
Наносекунд
|
|
TIME(0)
|
3
|
1
|
1000
|
1000000000
|
|
TIME(1)
|
3
|
0.1
|
100
|
100000000
|
|
TIME(2)
|
3
|
0.01
|
10
|
10000000
|
|
TIME(3)
|
4
|
0.001
|
1
|
1000000
|
|
TIME(4)
|
4
|
0.0001
|
0.1
|
100000
|
|
TIME(5)
|
5
|
0.00001
|
0.01
|
10000
|
|
TIME(6)
|
5
|
0.000001
|
0.001
|
1000
|
|
TIME(7)
|
5
|
0.0000001
|
0.0001
|
100
|
Существует
возможность привести значение TIME в INT, хотя это требует несколько шагов:
DECLARE @Time TIME(7) = '00:01:00' -- Формат HH:mm:SS[.nnnnnnn]
DECLARE @BinaryTime VARBINARY(8)
SET @BinaryTime = SUBSTRING(CONVERT(VARBINARY, REVERSE(CONVERT(VARBINARY, @Time))),
1,
DATALENGTH(@Time))
SELECT CONVERT(BIGINT, @BinaryTime)
-- Результат: 600000000
В приведенный
выше примере получен результат – 600000000, который, учитывая точность, вполне корректен.
Точность равна 7, поэтому время одной
минуты после полуночи будет равно 60
секундам = 600000000 / 107.
DECLARE @Time TIME(3) = '00:01:00' -- Формат HH:mm:SS[.nnnnnnn]
DECLARE @BinaryTime VARBINARY(8)
SET @BinaryTime = SUBSTRING(CONVERT(VARBINARY, REVERSE(CONVERT(VARBINARY, @Time))),
1,
DATALENGTH(@Time))
SELECT CONVERT(BIGINT, @BinaryTime)
-- Результат: 60000
С применением точности равной 3,
получен результат 60000, который тоже корректен, поскольку 60 секунд = 60000/10
3.
Дополнительную информацию о типе TIME можно подчерпнуть в BOL 2008
Подготовленно по материалам Danny's
SQL Server and Internals Viewer Blog