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 |