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


datetime2 (Transact-SQL)

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

Описание типа данных 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 наносекунд) справа от десятичной запятой, представляющих доли секунды.

  • В SQL Server 2012 при уровне совместимости, равном 10, устанавливается внутреннее соответствие литералов новому типу данных time.

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

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

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

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

Тип данных SQL Server 2012

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

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

Год, месяц и день копируются.

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

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1234';
DECLARE @date date = @datetime2;
SELECT @datetime2 AS '@datetime2', @date AS 'date';
--Result
--@datetime2               date
-------------------------- ----------
--2025-12-10 12:32:10.1234 2025-12-10
--
--(1 row(s) affected)

time(n)

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

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

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1237';
DECLARE @time time(3) = @datetime2;
SELECT @datetime2 AS '@datetime2', @time AS 'time(3)';
--Result
--@datetime2                time(3) 
-------------------------- ------------
--2025-12-10 12:32:10.1234 12:32:10.124
--
--(1 row(s) affected)

datetime

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

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

DECLARE @datetime2 datetime2 = '12-10-25 12:32:10.1234567'
DECLARE @datetime datetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
@datetime2             @datetime
---------------------- -----------------------
2025-12-10 12:32:10.12 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

smalldatetime

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

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

DECLARE @datetime2 datetime2 = '12-10-25 12:32:30.9234567';
DECLARE @smalldatetime smalldatetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime';
--Result
@datetime2             @smalldatetime
---------------------- -----------------------
2025-12-10 12:32:30.92 2025-12-10 12:33:00
(1 row(s) affected)

datetimeoffset(n)

Значение datetime2(n) копируется из значения datetimeoffset(n). Для смещения часового пояса устанавливается значение +00:0. Если точность значения типа datetime2(n) больше точности значения типа datetimeoffset(n), оно округляется.

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

D DECLARE @datetime2 datetime2(3) = '12-10-25 12:32:10.12999';
DECLARE @datetimeoffset datetimeoffset(2) = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset(2)';
--Result
--@datetime2              @datetimeoffset(2)
------------------------- -----------------------------
2025-12-10 12:32:10.13           2025-12-10 12:32:10.13 +00:00
--
--(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)