datetime2 (Transact-SQL)

Определяет дату, включающую время суток в 24-часовом формате. Тип данных datetime2 может рассматриваться как расширение существующего типа datetime, имеющее более широкий диапазон дат, большую точность в долях секунды по умолчанию и дополнительную точность, определяемую пользователем.

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

Описание типа данных datetime2

Свойство

Значение

Синтаксис

datetime2 [ (fractional seconds precision) ]

Использование

DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Таблица1 ( Столбец1 datetime2(7) )

Формат строковых литералов по умолчанию

(используется для клиента нижнего уровня)

ГГГГ-ММ-ДД чч:мм:сс[.доли секунды]

Дополнительные сведения см. в подразделе «Обратная совместимость для клиентов низкого уровня» следующего раздела.

Диапазон даты

От 0001-01-01 до 9999-12-31

С 1 января 1 года нашей эры до 31 декабря 9999 года нашей эры

Диапазон времени

От 00:00:00 до 23:59:59.9999999

Диапазон смещения часового пояса

Нет

Диапазоны элементов

ГГГГ представляет собой четырехзначное число от 0001 до 9999, определяющее год.

ММ — двузначное число от 01 до 12, представляющее месяц указанного года.

Обозначение ДД состоит из двух цифр, представляющих день указанного месяца, и принимает значения от 01 до 31 в зависимости от месяца.

Обозначение «чч» состоит из двух цифр, представляющих час, и принимает значения от 00 до 23.

Обозначение «мм» состоит из двух цифр, представляющих минуту, и принимает значения от 00 до 59.

Обозначение «сс» состоит из двух цифр, представляющих секунду, и принимает значения от 00 до 59.

Обозначение n* может содержать от нуля до семи цифр, представляющих доли секунды, и принимает значения от 0 до 9999999.

Длина в символах

Минимальная — 19 позиций (ГГГГ-ММ-ДД чч:мм:сс), максимальная — 27 позиций ((ГГГГ-ММ-ДД чч:мм:сс.0000000)

Точность, масштаб

От 0 до 7 цифр, с точностью 100 нс. Точность по умолчанию составляет 7 цифр.

Объем памяти

6 байт для представления точности меньше 3 цифр, 7 байт — для точности в 3 и 4 цифры. Для представления любых других значений точности требуется 8 байт.

Точность

100 наносекунд

Значение по умолчанию

1900-01-01 00:00:00

Календарь

Григорианский

Определяемая пользователем точность в долях секунды

Да

Учет и сохранение смещения часового пояса

Нет

Учет перехода на летнее время

Нет

Сведения о метаданных для типов данных см. в разделе sys.systypes (Transact-SQL) или TYPEPROPERTY (Transact-SQL). В некоторых типах данных дат и времени точность и масштаб разные. Сведения о точности и масштабе для столбца см. в разделе COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL) или sys.columns (Transact-SQL).

Поддерживаемые форматы строковых литералов для типа данных datetime2

В следующих таблицах приводятся поддерживаемые форматы строковых литералов ISO 8601 и ODBC для типа данных datetime2. Дополнительные сведения об алфавитных и числовых форматах, форматах строки без разделителей и форматах времени для компонентов даты и времени datetime2 см. в разделах date (Transact-SQL) и time (Transact-SQL).

ISO 8601

Описания

ГГГГ-ММ-ДДТчч:мм:сс[. ннннннн]

ГГГГ-ММ-ДДТчч:мм:сс[. ннннннн]

На этот формат не влияют настройки локали сеанса инструкций SET LANGUAGE и SET DATEFORMAT. Символы T, двоеточие (:) и точка (.) включаются в строковый литерал, например «2007-05-02T19:58:47.1234567».

Интерфейс ODBC

Описание

{ ts 'гггг-мм-дд чч:мм:сс[.доли секунды]' }

Зависит от API-интерфейса ODBC.

Можно указать от 0 до 7 знаков (100 наносекунд) справа от десятичной запятой, представляющих доли секунды.

Соответствие стандартам ANSI и ISO 8601

Соглашения стандартов ANSI и ISO 8601 для типов данных date и time применимы к типу данных datetime2.

Обратная совместимость для клиентов нижнего уровня

Некоторые клиенты низкого уровня не поддерживают типы данных time, date, datetime2 и datetimeoffset. В следующей таблице показано сопоставление типов экземпляра более высокого уровня SQL Server и клиентов низкого уровня.

Тип данных SQL Server

Формат строкового литерала по умолчанию, передаваемый клиенту низкого уровня

ODBC низкого уровня

OLEDB низкого уровня

JDBC низкого уровня

SQLCLIENT низкого уровня

time

чч:мм:сс[. ннннннн]

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

date

ГГГГ-ММ-ДД

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

datetime2

ГГГГ-ММ-ДД чч:мм:сс[. ннннннн]

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

datetimeoffset

ГГГГ-ММ-ДД чч:мм:сс[. ннннннн] [+|-]чч:мм

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

Преобразование данных типа Date и Time

При преобразовании в типы данных даты и времени SQL Server отвергает все значения, которые он не распознает как значения даты или времени. Дополнительные сведения об использовании функций CAST и CONVERT c данными типов даты и времени см. в разделе Функции CAST и CONVERT (Transact-SQL).

Преобразование типа данных datetime2 в другие типы данных даты и времени

В следующей таблице показано, каким образом тип данных datetime2 преобразуется в другие типы даты и времени.

Тип данных, в который выполняется преобразование

Дополнительные сведения о преобразовании

date

Год, месяц и день копируются. Для компонента времени устанавливается значение 00:00:00.000.

Следующий код демонстрирует результаты преобразования значения date в значение datetime.

DECLARE @date date = '12-21-05';
DECLARE @datetime datetime = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
--Result
--@datetime               @date
------------------------- ----------
--2005-12-21 00:00:00.000 2005-12-21

time(n)

Компонент времени копируется, для компонента даты устанавливается значение «1900-01-01». Если точность в долях секунды значения time(n) больше трех цифр, значение будет усечено.

Следующий пример показывает результаты преобразования значения time(4) в значение datetime.

DECLARE @time time(4) = '12:10:05.1237';
DECLARE @datetime datetime = @time;
SELECT @datetime AS '@datetime', @time AS '@time';
--Result
--@datetime               @time
------------------------- -------------
--1900-01-01 12:10:05.123 12:10:05.1237
--
--(1 row(s) affected)

smalldatetime

Копируются часы и минуты. Секунды и доли секунд устанавливаются в значение 0.

Следующий код демонстрирует результаты преобразования значения smalldatetime в значение datetime.

DECLARE @smalldatetime smalldatetime = '12-01-01 12:32';
DECLARE @datetime datetime = @smalldatetime;
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';
--Result
--@datetime               @smalldatetime
------------------------- -----------------------
--2001-12-01 12:32:00.000 2001-12-01 12:32:00
--
--(1 row(s) affected)

datetimeoffset(n)

Копируются компоненты даты и времени. Часовой пояс усекается. Если точность в долях секунд для значения datetimeoffset(n) превышает три разряда, значение будет усечено.

Следующий пример показывает результаты преобразования значения datetimeoffset(4) в значение datetime.

DECLARE @datetimeoffset datetimeoffset(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime datetime = @datetimeoffset;
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';
--Result
--@datetime               @datetimeoffset
------------------------- ------------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +01:0
--
--(1 row(s) affected)

datetime2(n)

Копируются компоненты даты и времени. Если точность в долях секунд для значения datetime2(n) превышает три разряда, значение будет усечено.

Следующий пример показывает результаты преобразования значения datetime2(4) в значение datetime.

DECLARE @datetime2 datetime2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime datetime = @datetime2;
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';
--Result
--@datetime               @datetime2
------------------------- ------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
--
--(1 row(s) affected)

Преобразование строковых литералов в datetime2

Преобразование строковых литералов в типы данных даты и времени разрешается, если все части строк записаны в допустимом формате. Иначе возникает ошибка времени выполнения. Явные или скрытые преобразования, в которых не задан стиль преобразования типов данных даты и времени в строковые литералы, будут проведены в формате по умолчанию для текущего сеанса. В следующей таблице приводятся правила преобразования строковых литералов в типы данных datetime2.

Строковый литерал входа

datetime2(n)

ODBC DATE

Строковые литералы ODBC сопоставляются с типом данных datetime. Любая операция присваивания литералов ODBC DATETIME в типы данных datetime2 вызывает неявное преобразование между данным типом и типом datetime согласно правилам преобразования.

ODBC TIME

См. предыдущее правило ODBC DATE.

ODBC DATETIME

См. предыдущее правило ODBC DATE.

только DATE

Компонент TIME по умолчанию имеет значение 00:00:00.

только TIME

Компонент DATE по умолчанию имеет значение 1900-1-1.

только TIMEZONE

Указаны значения по умолчанию.

DATE + TIME

Простейший.

DATE + TIMEZONE

Не допускается.

TIME + TIMEZONE

Компонент DATE по умолчанию имеет значение 1900-1-1. Входное значение TIMEZONE не учитывается.

DATE + TIME + TIMEZONE

Используется локальный компонент DATETIME.

Примеры

В следующем примере сравниваются результаты приведения строкового типа к каждому из типов данных date и time.

SELECT 
     CAST('2007-05-08 12:35:29. 1234567 +12:15' AS time(7)) AS 'time' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS date) AS 'date' 
    ,CAST('2007-05-08 12:35:29.123' AS smalldatetime) AS 
        'smalldatetime' 
    ,CAST('2007-05-08 12:35:29.123' AS datetime) AS 'datetime' 
    ,CAST('2007-05-08 12:35:29. 1234567 +12:15' AS datetime2(7)) AS 
        'datetime2'
    ,CAST('2007-05-08 12:35:29.1234567 +12:15' AS datetimeoffset(7)) AS 
        'datetimeoffset';

Ниже приводится результирующий набор.

Тип данных

Вывод

time

12:35:29. 1234567

date

2007-05-08

smalldatetime

2007-05-08 12:35:00

datetime

2007-05-08 12:35:29.123

datetime2

2007-05-08 12:35:29. 1234567

datetimeoffset

2007-05-08 12:35:29.1234567 +12:15

См. также

Справочник

Функции CAST и CONVERT (Transact-SQL)