Поделиться через


datetime2 (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в базе данных Microsoft Fabric SQL в Microsoft Fabric

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

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

Свойство Значение
Синтаксис datetime2 [ (fractional seconds precision) ]
Использование DECLARE @MyDatetime2 datetime2(7);
CREATE TABLE Table1 (Column1 datetime2(7));
Формат строковых литералов по умолчанию

(используется для клиента нижнего уровня)
yyyy-MM-dd HH:mm:ss[.nnnnnnn]

Дополнительные сведения см. в разделе "Обратная совместимость" для клиентов нижнего уровня далее в этой статье.
Диапазон дат 0001-01-01 через 9999-12-31

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

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

dd — это двухзначное число, от 01 31 которого зависит от месяца, который представляет день указанного месяца.

HH — это двухзначное число, от которого 00 23определяется час.

mm — это двухзначное число, начиная от 00 59от , которое представляет минуту.

ss — это двухзначное число, начиная от 00 59от , которое представляет второй.

n* — от нуля до семизначного числа, 0 9999999представляющего дробные секунды. В Informatica дробные секунды усечены, если n меньше 3.
Длина в символах Минимальное значение 19 позиций (yyyy-MM-dd HH:mm:ssдо 27) (yyyy-MM-dd HH:mm:ss.0000000)
Точность, масштаб От 0 до 7 цифр с точностью 100 наносекунд (100 ns). Точность по умолчанию составляет 7 цифр.

В хранилище данных Microsoft Fabric эта точность может быть целым числом от 0 до 6 без значения по умолчанию. Точность должна быть указана в хранилище данных Microsoft Fabric.
Объем памяти 1 6 байтов для представления точности меньше 3 цифр.
7 байтов — для точности в 3 или 4 цифры.

Для всей другой точности требуется 8 байт. 2
Правильность 100 наносекунд
Default value 1900-01-01 00:00:00
Календарь Григорианский
Определяемая пользователем точность в долях секунды Да
Учет и сохранение смещения часового пояса No
Учет перехода на летнее время No

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

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

Сведения о метаданных типа данных см. в разделе sys.systypes или TYPEPROPERTY. В некоторых типах данных дат и времени точность и масштаб разные. Чтобы получить точность и масштаб столбца, см. статью COLUMNPROPERTY, COL_LENGTH или sys.column.

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

В таблицах ниже приводятся поддерживаемые форматы строковых литералов ISO 8601 и ODBC для типа данных datetime2. Сведения о алфавитном, числовых, неисполненных и временных форматах для частей даты и времени даты и времени см. в разделе даты и времени.

ISO 8601 Descriptions
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] Этот формат не влияет на SET LANGUAGE SET DATEFORMAT параметры языкового стандарта сеанса. Двоеточия T(:) и период (.) включаются в строковый литерал, например 2024-05-02T19:58:47.1234567.
ODBC Description
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } Зависит от 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 HH:mm:ss[.nnnnnnnnn] 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 гггг-ММ-дд HH:mm:ss[.nnnnnnnnn] SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString
datetimeoffset гггг-ММ-дд HH:mm:ss[.nnnnn] [+|-]hh:mm SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTR или DBTYPE_STR Java.sql.String String или SqString

Преобразование данных даты и времени

При преобразовании в типы данных даты и времени ядро СУБД отклоняет все значения, которые не могут распознаваться как даты или время. Сведения об использовании функций CAST и CONVERT с данными даты и времени см. в разделе CAST и CONVERT

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

В этом разделе описывается, что происходит при преобразовании других типов даты и времени в тип данных datetime2.

При преобразовании из типа date копируются год, месяц и день. Для компонента времени устанавливается значение 00:00:00.0000000. Следующий код демонстрирует результаты преобразования значения date в значение datetime2.

DECLARE @date AS DATE = '12-21-16';

DECLARE @datetime2 AS DATETIME2 = @date;

SELECT @datetime2 AS '@datetime2',
       @date AS '@date';

Вот результирующий набор.

@datetime2                  @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21

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

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

DECLARE @datetime2 AS DATETIME2 = @time;

SELECT @datetime2 AS '@datetime2',
       @time AS '@time';

Вот результирующий набор.

@datetime2                  @time
--------------------------- ----------------
1900-01-01 12:10:16.1234567 12:10:16.1234567

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

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

DECLARE @datetime2 AS DATETIME2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2',
       @smalldatetime AS '@smalldatetime';

Вот результирующий набор.

@datetime2                  @smalldatetime
--------------------------- -----------------------
2016-12-01 12:32:00.0000000 2016-12-01 12:32:00

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

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

DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2',
       @datetimeoffset AS '@datetimeoffset';

Вот результирующий набор.

@datetime2                  @datetimeoffset
--------------------------- ----------------------------------
2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

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

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

DECLARE @datetime2 AS DATETIME2 = @datetime;

SELECT @datetime2 AS '@datetime2',
       @datetime AS '@datetime';

Вот результирующий набор.

@datetime2                  @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

Явное приведение к datetime2 при использовании datetime

В соответствии с уровнем совместимости базы данных 130 и выше неявные преобразования из типов данных datetime в datetime2 показывают улучшенную точность за счет учета дробных миллисекунд, что приводит к различным преобразованным значениям, как показано в предыдущем примере. Используйте явное приведение к типу данных datetime2 всякий раз, когда существует смешанный сценарий сравнения между типами данных datetime и datetime2 . Дополнительные сведения см. в статье SQL Server и База данных SQL Azure улучшения обработки некоторых типов данных и необычных операций.

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

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

Строковый литерал входа datetime2(n)
ODBC DATE Строковые литералы ODBC сопоставляются с типом данных datetime. Любая операция назначения из литералов в ODBC DATETIME типы datetime2 вызывает неявное преобразование между датой и этим типом, как определено правилами преобразования.
ODBC TIME См. предыдущее ODBC DATE правило.
ODBC DATETIME См. предыдущее ODBC DATE правило.
Только DATE Часть TIME по умолчанию 00:00:00.
Только TIME Часть DATE по умолчанию 1900-01-01.
Только 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