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Подготовленно по материалам