datetimeoffset (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)

Определяет дату, которая объединяется со временем в 24-часовом формате, например datetime2, и добавляет сведения о часовом поясе на основе UTC (всемирное скоординированное время, или время по Гринвичу).

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

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

CREATE TABLE Таблица1 ( Столбец1 datetimeoffset(7) )
Форматы строковых литералов по умолчанию (используются для клиента нижнего уровня) ГГГГ-ММ-ДД чч:мм:сс[.nnnnn] [{+|-}hh:mm]

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

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

ММ обозначает 2 цифры, которые представляют месяц и принимают значения от 01 до 12.

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

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

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

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

Обозначение n* может содержать от нуля до семи цифр, представляющих доли секунды, и принимает значения от 0 до 9999999.

Обозначение чч состоит из двух цифр и может принимать значения от -14 до +14.

Обозначение мм состоит из двух цифр и может принимать значения от 00 до 59.
Длина в символах Минимум 26 позиций (ггГГ-ММ-ДД чч:мм:мм:сс {+|-}hh:mm) до 34 максимум (ГГГГ-ММ-ДД чч:мм:сс.nnnnn {+|-}hh:mm)
Точность, масштаб См. таблицу ниже.
Объем памяти 10 байт, по умолчанию используется фиксированная точность 100 нс.
Правильность 100 наносекунд
Default value 1900-01-01 00:00:00 00:00
Calendar Григорианский
Определяемая пользователем точность в долях секунды Да
Учет и сохранение смещения часового пояса Да
Учет перехода на летнее время No
Указанный масштаб Результат (точность, масштаб) Длина столбца (в байтах) Точность в долях секунды
datetimeoffset (34,7) 10 7
datetimeoffset(0) (26,0) 8 0–2
datetimeoffset(1) (28,1) 8 0–2
datetimeoffset(2) (29,2) 8 0–2
datetimeoffset(3) (30,3) 9 3–4
datetimeoffset(4) (31,4) 9 3–4
datetimeoffset(5) (32,5) 10 5–7
datetimeoffset(6) (33,6) 10 5–7
datetimeoffset(7) (34,7) 10 5–7

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

В приведенной ниже таблице перечислены поддерживаемые форматы строковых литералов ISO 8601 для типа данных datetimeoffset. Сведения об алфавитных и числовых форматах, форматах строки без разделителей и форматах времени для частей даты и времени типа datetimeoffset см. в статьях date (Transact-SQL) и time (Transact-SQL).

ISO 8601 Description
ГГГГ-ММ-DDThh:mm:ss[.nnnnn][{+|-}hh:mm] На эти два формата не влияют настройки локали сеанса инструкций SET LANGUAGE и SET DATEFORMAT. Между частями datetimeoffset и datetime не должно быть пробелов.
ГГГГ-ММ-ДДТчч:мм:сс[.ннннннн]Z (в формате UTC) Этот формат по определению ISO указывает, что компонент datetime должен выражаться во времени в формате UTC. Например, дата и время 1999-12-12 12:30:30.12345 -07:00 должны представляться как 1999-12-12 19:30:30.12345Z.

Смещение часового пояса

Смещение часового пояса задает смещение относительно времени в формате UTC для значения типа time или datetime. Смещение часового пояса может быть представлено в формате [+|-] чч:мм:

  • обозначение чч состоит из двух цифр, представляющих количество часов в смещении часового пояса, и принимает значения от 0 до 14;
  • обозначение мм состоит из двух цифр, представляющих дополнительное смещение часового пояса в минутах, и принимает значения от 00 до 59;
  • + (плюс) или – (минус) представляет собой обязательный знак смещения для часового пояса. Данный знак указывает, добавляется или вычитается смещение часового пояса от времени в формате UTC, чтобы получить локальное время. Допустимый диапазон смещения часового пояса: от -14:00 до +14:00.

Диапазон смещения часового пояса соответствует стандарту W3C XML для определения XSD-схемы и немного отличается от стандартного определения SQL 2003, от 12:59 до +14:00.

Необязательный параметр типа fractional seconds precision задает количество знаков в дробной части секунды. Значение может быть целым числом от 0 до 7 (100 наносекунд). По умолчанию значение fractional seconds precision равно 100 нс (семь знаков в дробной части секунды).

Эти данные хранятся в базе данных и обрабатываются, сравниваются, сортируются и индексируются на сервере как значения в формате UTC. Смещение часового пояса будет сохранено в базе данных для получения.

Предполагается, что заданное смещение часового пояса будет учитывать переход на летнее время и настраиваться для любого заданного типа datetime, учитывающего этот переход.

Для типа данных datetimeoffset как значение в формате UTC, так и локальное (в постоянном или преобразованном смещении часового пояса) значение datetime будет проверяться во время операций вставки, обновления, преобразования, присвоения или арифметических операций. Обнаружение недопустимого значения (в постоянном или преобразованном смещении часового пояса) типа datetime (локального или в формате UTC) вызовет ошибку недопустимого значения. Например, 9999-12-31 10:10:00 допустимо в UTC, но переполнено для местного времени при смещении часового пояса на +13:50.

Сведения о преобразовании даты в соответствующее значение datetimeoffset в целевом часовом поясе см. в статье AT TIME ZONE (Transact-SQL).

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

Тип данных datetimeoffset соответствует стандартам date и time ANSI и ISO 8601.

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

Некоторые клиенты нижнего уровня не поддерживают типы данных 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).

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

Этот раздел описывает, что происходит при преобразовании типа данных datetimeoffset в другие типы даты и времени.

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

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date DATE = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @date AS 'date';

Результирующий набор:

@datetimeoffset                 date  
------------------------------ ----------  
2025-12-10 12:32:10.0000 +01:0 2025-12-10  

При преобразовании в тип time(n) копируются час, минута, секунда и доли секунды. Значение часового пояса усекается. Если точность значения типа datetimeoffset(n) больше точности значения типа time(n), оно округляется в сторону увеличения. Следующий код демонстрирует результаты преобразования значения datetimeoffset(4) в значение time(3).

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time TIME(3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';

Результирующий набор:

@datetimeoffset                 time  
------------------------------- ------------  
2025-12-10 12:32:10.1237 +01:00 12:32:10.124  

При преобразовании в тип datetime значения даты и времени копируются; часовой пояс усекается. Если точность в долях секунды для значения datetimeoffset(n) превышает три разряда, значение будет усечено. Следующий код демонстрирует результаты преобразования значения datetimeoffset(4) в значение datetime.

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime DATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';

Результирующий набор:

@datetimeoffset                datetime  
------------------------------ -----------------------  
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123  

При преобразовании в тип smalldatetime копируются значения даты и часы. Минуты округляются в сторону увеличения с учетом значения секунд, а секунды устанавливаются в 0. Следующий код демонстрирует результаты преобразования значения datetimeoffset(3) в значение smalldatetime.

DECLARE @datetimeoffset DATETIMEOFFSET(3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime SMALLDATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';

Результирующий набор:

@datetimeoffset                @smalldatetime  
------------------------------ -----------------------  
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00  

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

DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 DATETIME2(3) = @datetimeoffset;

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

Результирующий набор:

@datetimeoffset                    @datetime2  
---------------------------------- ----------------------  
1912-10-25 12:24:32.1277 +10:00    1912-10-25 12:24:32.12  

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

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

Строковый литерал входа datetimeoffset(n)
ODBC DATE Строковые литералы ODBC сопоставляются с типом данных datetime. Любая операция присваивания литералов ODBC DATETIME типам данных datetimeoffset вызывает неявное преобразование между данным типом и типом datetime согласно правилам преобразования.
ODBC TIME См. предыдущее правило ODBC DATE.
ODBC DATETIME См. предыдущее правило ODBC DATE.
только DATE Компонент TIME по умолчанию имеет значение 00:00:00. Компонент TIMEZONE по умолчанию имеет значение +00:00.
только TIME Компонент DATE по умолчанию имеет значение 1900-1-1. Компонент TIMEZONE по умолчанию будет иметь значение +00:00.
только TIMEZONE Указаны значения по умолчанию
DATE + TIME Компонент TIMEZONE по умолчанию имеет значение +00:00.
DATE + TIMEZONE Не разрешенный
TIME + TIMEZONE Компонент DATE по умолчанию имеет значение 1900-1-1.
DATE + TIME + TIMEZONE Простейший.

Примеры

В приведенном ниже примере сравниваются результаты приведения строкового типа к каждому из типов данных 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',
    CAST('2007-05-08 12:35:29.1234567+12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset IS08601';

Результирующий набор:

Тип данных Выходные данные
Time 12:35:29. 1234567
Дата 2007-05-08
Smalldatetime 2007-05-08 12:35:00
Дата и время 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)
AT TIME ZONE (Transact-SQL)