Новые типы данных в SQL Server 2008 - Дата и время
ОГЛАВЛЕНИЕ
Дата и время
Используя старый формат datetime, пользователи SQL Server® не могли работать с информацией о дате и времени отдельно. Четыре новых типа данных – date, time, datetime2 и datetimeoffset – меняют дело, упрощая работу с данными о дате и времени, обеспечивая больший диапазон дат, точность до долей секунды и поддержку часовых поясов. Новые приложения для баз данных будут использовать эти новые типы данных вместо устаревшего datetime. Посмотрим на эти новые версии вблизи.
Тип данных date сохраняет дату без компонента времени. Диапазон – от 1 января 1000 года до 31 декабря 9999 года (от 0001-01-01 до 9999-12-31). Каждая переменная даты требует трех байтов для хранения и имеет точность в 10 цифр. Точность типа данных ограничена отдельным днем.
На рис. 1 показано, как содавать и инициализировать переменные Date в сценариях T-SQL. Переменная @myDate1 инициализируется строкой в формате 'MM/DD/YYYY'. Переменная @myDate2 не инициализируется, она будет иметь значение NULL. Переменная @myDate3 инициализируется на дату локальной системы компьютера. Значение переменных может быть в любой момент изменено с помощью инструкций SELECT или SET, это показано на примере изменения значения @myDate2. Столбцы дат можно создавать и в таблицах. На рис. 2 показано, как создать таблицу с тремя столбцами дат.
Рис 1 Create and initialize date variables in T-SQL scripts
DECLARE @myDate1 date = '01/22/2005'Рис 2 Create a table with three date columns
DECLARE @myDate2 date
DECLARE @myDate3 date = GetDate()
SELECT @myDate2 = '2007-05-08 12:35:29.1234567 +12:15'
SELECT @myDate1 AS '@myDate1',
@myDate2 AS '@myDate2',
@myDate3 AS '@myDate3'
--Results
--@myDate1 @myDate2 @myDate3
------------ ---------- ----------
--2005-01-22 2007-05-08 2007-11-20
USE TempDB
GO
CREATE TABLE myTable
(
myDate1 date,myDate2 date,myDate3 date
)
GO
INSERT INTO myTable
VALUES('01/22/2005',
'2007-05-08 12:35:29.1234567 +12:15',
GetDate())
SELECT * FROM myTable
--Results
--myDate1 myDate2 myDate3
------------ ---------- ----------
--2005-01-22 2007-05-08 2007-11-20
Тип данных time сохраняет время суток без компонента даты. Он основан на 24-часовом формате, поэтому поддерживаемый диапазон – от 00:00:00.0000000 до 23:59:59.9999999 (часы, минуты, секунды и доли секунды). Точность в долях секунды можно задать при создании типа данных. По умолчанию используется 7 цифр и точность 100 наносекунд. Точность влияет на занимаемый объем, который меняется от 3 байт для двух цифр, 4 байт для от 3 до 4 цифр и до 5 байт для от 5 до 7 цифр.
Сценарий T-SQL на рис. 3 показывает, как неявные преобразования значения инициализации строки влияют на точность переменной. Сперва код T-SQL создает и инициализирует на одинаковые значения восемь отдельных переменных времени. Точность в долях секунды каждой переменной соответствует ее названию. Например, @myTime3 имеет точность в три знака после запятой. Результаты показывают, что точность каждого типа данных time эквивалентна точности в долях, с которой она объявляется. Цифры, не попадающие в диапазон, отбрасываются.
Рис. 3 Display time data type's variable precisionDECLARE @myTime time = '01:01:01.1234567 +01:01'Тип данных time можно создать как столбец в таблице. Сценарий T-SQL DROP TABLE myTable на рис. 4 создает таблицу «myTable1» и добавляет в нее три столбца времени. Затем в таблицу помещается запись; содержимое таблицы отображается с помощью инструкции SELECT.
DECLARE @myTime1 time(1) = '01:01:01.1234567 +01:01'
DECLARE @myTime2 time(2) = '01:01:01.1234567 +01:01'
DECLARE @myTime3 time(3) = '01:01:01.1234567 +01:01'
DECLARE @myTime4 time(4) = '01:01:01.1234567 +01:01'
DECLARE @myTime5 time(5) = '01:01:01.1234567 +01:01'
DECLARE @myTime6 time(6) = '01:01:01.1234567 +01:01'
DECLARE @myTime7 time(7) = '01:01:01.1234567 +01:01'
SELECT @myTime AS '@myTime',
@myTime1 AS '@myTime1',
@myTime2 AS '@myTime2',
@myTime3 AS '@myTime3',
@myTime4 AS '@myTime4',
@myTime5 AS '@myTime5',
@myTime6 AS '@myTime6',
@myTime7 AS '@myTime7'
--Results
--@myTime @myTime1 @myTime2 @myTime3 @myTime4
------------------ ---------- ----------- ------------ -------------
--01:01:01.1234567 01:01:01.1 01:01:01.12 01:01:01.123 01:01:01.1235
--
--@myTime5 @myTime6 @myTime7
---------------- --------------- ----------------
--01:01:01.12346 01:01:01.123457 01:01:01.1234567
DROP TABLE myTable
Рис. 4 Create myTable1
USE TempDB
GO
CREATE TABLE myTable1
(
myTime1 time(1),
myTime2 time(2),
myTime3 time(3)
)
GO
INSERT INTO myTable1
VALUES('01:30:01.1234567',
'02:34:01.1234567',
'03:01:59.1234567')
SELECT * from myTable1
--Results
--myTime1 myTime2 myTime3
------------ ----------- ------------
--01:30:01.1000000 02:34:15.1200000 03:01:59.1230000
DROP TABLE myTable1