Опубліковані 12-01-2008 11:51 від Александр Волок
Зареєстрований як ,

Тип данных TIME в SQL Server 2008

Новый тип 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/
103.

Дополнительную информацию о типе TIME можно подчерпнуть в BOL 2008
Подготовленно по материалам Danny's SQL Server and Internals Viewer Blog



Коментарі

Andrey Altukhov said:

Как вы работаете SQL Server 2008?

Sql Server 2008 + VS 2008  или  Sql Server 2008 + VS 2005

January 14, 2008 8:23 PM
kosinsky said:

При установке SQL Server 2008 Nov CTP (это последний) пока ставиться VS2005

January 15, 2008 12:58 AM
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.