datetime2 (Transact-SQL)

Область применения:yesSQL Server (все поддерживаемые версии) YesБаза данных SQL Azure YesУправляемый экземпляр SQL Azure yesAzure Synapse Analytics yesСистема платформы аналитики (PDW)

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

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

Property (Свойство) Значение
Синтаксис datetime2 [ (fractional seconds precision) ]
Использование DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Таблица1 ( Столбец1 datetime2(7) )
Формат строковых литералов по умолчанию

(используется для клиента нижнего уровня)
ГГГГ-ММ-ДД чч:мм:сс[.доли секунды]

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

С 1 января 1 года нашей эры до 31 декабря 9999 года нашей эры
Диапазон времени от 00:00:00 до 23:59:59.9999999
Диапазон смещения часового пояса None
Диапазоны элементов ГГГГ представляет собой четырехзначное число от 0001 до 9999, определяющее год.

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

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

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

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

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

Обозначение n* может содержать от нуля до семи цифр, представляющих доли секунды, и принимает значения от 0 до 9999999. В Informatica доли секунды усекаются при n > 3.
Длина в символах Минимальная — 19 позиций (ГГГГ-ММ-ДД чч:мм:сс), максимальная — 27 позиций ((ГГГГ-ММ-ДД чч:мм:сс.0000000)
Точность, масштаб От 0 до 7 цифр, с точностью 100 нс. Точность по умолчанию составляет 7 цифр.
Объем памяти 1 6 байтов для представления точности меньше 3 цифр.
7 байтов — для точности в 3 или 4 цифры.
Для представления любых других значений точности требуется 8 байт 2.
Точность 100 наносекунд
Значение по умолчанию 1900-01-01 00:00:00
Календарь Григорианский
Определяемая пользователем точность в долях секунды Да
Учет и сохранение смещения часового пояса Нет
Учет перехода на летнее время Нет

1 Указанные значения относятся к несжатым rowstore. Использование сжатия данных или columnstore может изменить размер хранилища для каждого уровня точности. Кроме того, размер хранилища на диске и в памяти может различаться. Например, значения datetime2 при использовании пакетного режима всегда требует 8 байт в памяти.

2 При приведении значения datetime2 к значению varbinary к значению varbinary добавляется дополнительный байт для сохранения точности.

Сведения о метаданных типа данных см. в статье 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 Описания
ГГГГ-ММ-ДДТчч:мм:сс[.nnnnnnn]

ГГГГ-ММ-ДДТчч:мм:сс[.nnnnnnn]
На этот формат не влияют настройки локали сеанса инструкций 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.0000000. Следующий код демонстрирует результаты преобразования значения date в значение datetime2.

DECLARE @date date = '12-21-16';
DECLARE @datetime2 datetime2 = @date;

SELECT @datetime2 AS '@datetime2', @date AS '@date';
  
--Result  
--@datetime2                  @date
----------------------------- ----------
--2016-12-21 00:00:00.0000000 2016-12-21

При преобразовании из time(n) компонент времени копируется, а для компонента даты устанавливается значение 1900-01-01. Следующий пример показывает результаты преобразования значения time(7) в значение datetime2.

DECLARE @time time(7) = '12:10:16.1234567';
DECLARE @datetime2 datetime2 = @time;

SELECT @datetime2 AS '@datetime2', @time AS '@time';
  
--Result  
--@datetime2                  @time
----------------------------- ----------------
--1900-01-01 12:10:16.1234567 12:10:16.1234567

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

DECLARE @smalldatetime smalldatetime = '12-01-16 12:32';
DECLARE @datetime2 datetime2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime'; 
  
--Result  
--@datetime2                  @smalldatetime
----------------------------- -----------------------
--2016-12-01 12:32:00.0000000 2016-12-01 12:32:00 

При преобразовании из типа datetimeoffset(n) копируются компоненты даты и времени. Часовой пояс усекается. Следующий пример показывает результаты преобразования значения datetimeoffset(7) в значение datetime2.

DECLARE @datetimeoffset datetimeoffset(7) = '2016-10-23 12:45:37.1234567 +10:0';
DECLARE @datetime2 datetime2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset'; 
  
--Result  
--@datetime2                  @datetimeoffset
----------------------------- ----------------------------------
--2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

При преобразовании из типа datetime копируются дата и время. Точность в долях увеличивается до 7 цифр. Следующий пример показывает результаты преобразования значения datetime в значение datetime2.

DECLARE @datetime datetime = '2016-10-23 12:45:37.333';
DECLARE @datetime2 datetime2 = @datetime;

SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
   
--Result  
--@datetime2                  @datetime
------------------------- ---------------------------
--2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

Примечание

При уровне совместимости базы данных 130 неявные преобразования типов данных из datetime в datetime2 демонстрируют повышенную точность благодаря учету долей миллисекунд. В результате преобразования дают иные значения, как показано в примере выше. Всегда используйте явное приведение к типу данных datetime2, когда имеется сценарий смешанного сравнения типов данных datetime и datetime2. Дополнительные сведения см. в этой статье на сайте службы поддержки Майкрософт.

Преобразование строковых литералов в 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)