datetime2 (Transact-SQL)
Область применения: SQL Server
База данных SQL Azure Управляемый экземпляр SQL Azure
конечной точке аналитики платформы Аналитики Azure Synapse Analytics
(PDW)
в Microsoft Fabric
Хранилище в Microsoft Fabric
Определяет дату, включающую время суток в 24-часовом формате. Тип данных datetime2 может рассматриваться как расширение существующего типа datetime, имеющее более широкий диапазон дат, большую точность в долях секунды по умолчанию и дополнительную точность, определяемую пользователем.
Описание типа данных datetime2
Свойство | Значение |
---|---|
Синтаксис | 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 |
Диапазон смещения часового пояса | нет |
Диапазоны элементов | ГГГГ представляет собой четырехзначное число от 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 цифр. В 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 (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 | Descriptions |
---|---|
ГГГГ-ММ-ДДТчч:мм:сс[.nnnnnnn] ГГГГ-ММ-ДДТчч:мм:сс[.nnnnnnn] |
На этот формат не влияют настройки локали сеанса инструкций SET LANGUAGE и SET DATEFORMAT. Символы T, двоеточие (:) и точка (.) включаются в строковый литерал, например "2007-05-02T19:58:47.1234567". |
ODBC | Description |
---|---|
{ 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 | ГГГГ-ММ-ДД чч:мм:сс[.nnnnn] [+|-]hh:mm | 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 |