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

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

SQL Server 2008 содержит несколько новых типов данных, включая типы для работы с датой и временем:
DATE – содержит значения даты
TIME – содержит значения времени, с точностью до 100 наносекунд
DATETIME2 – содержит значения даты и времени, но с более высокой точностью времени
DATETIMEOFFSET – содержит значения даты и времени включающие смещение по часовому поясу.

Внутреннее представление типа DATE

Тип DATE попросту содержит дату, в диапазоне от 1 января 0001 до 31 декабря 9999. Внутри же тип хранится в виде 3-х байтового INTEGER. Значение INT это количество прошедших дней после базовой даты 01.01.0001.

Напрямую конвертировать INT в DATE невозможно. Результатом выполнения:

    SELECT CONVERT(DATE, 1)

будет следующая ошибка:

Msg 529, Level 16, State 2, Line 1
Explicit conversion from data type int to date is not allowed.


Но все же, существует возможность конвертации INT в DATE посредством промежуточного конвертирования целочисленного типа в BINARY(3) с последующим реверсом байтов и итоговом конвертировании в DATE.

В следующем примере приведено пошаговое увеличение 24-битового INT, который соответствует базовой дате:

    DECLARE @IntValue INT
    SET @IntValue = 0
  
    SELECT CONVERT(DATE, CONVERT(BINARY(3), REVERSE(CONVERT(BINARY(3), @IntValue))))
    -- Результат: 0001-01-01
   
    SET @IntValue = 1
   
    SELECT CONVERT(DATE, CONVERT(BINARY(3), REVERSE(CONVERT(BINARY(3), @IntValue))))
    -- Результат: 0001-01-02
   
    SET @IntValue = 2
   
    SELECT CONVERT(DATE, CONVERT(BINARY(3), REVERSE(CONVERT(BINARY(3), @IntValue))))
    -- Результат: 0001-01-03
   
    SET @IntValue = 3
   
    SELECT CONVERT(DATE, CONVERT(BINARY(3), REVERSE(CONVERT(BINARY(3), @IntValue))))
    -- Результат: 0001-01-04
   

Отличной особенностью DATE от SMALLDATETIME является невозможность (по крайне мере в ноябрьском CTP) добавлять или удалять дни из даты. Код:
    DECLARE @Date DATE = '2008-02-01'
    SELECT @Date + 1


Приведет к ошибке:

Msg 206, Level 16, State 2, Line 2
Operand type clash: date is incompatible with int

Также, в результате сложение двух значений DATE,  будет такая ошибка:

Msg 8117, Level 16, State 1, Line 3
Operand data type date is invalid for add operator.

Дополнительную информацию о типе DATE можно подчерпнуть в BOL 2008

Подготовленно по материалам Danny's SQL Server and Internals Viewer Blog

Коментарі

Немає коментарів
Анонімні коментарі деактивовані. Увійдіть або Зареєструйтесь щоб мати доступ до ресурсів Спільноти.