datetimeoffset (Transact-SQL)

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

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

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

Свойство Значение
Синтаксис DATETIMEOFFSET [ ( точность дробных секунд ) ]
Использование DECLARE @MyDatetimeoffset DATETIMEOFFSET(7);
CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7));
Форматы строковых литералов по умолчанию (используются для клиента нижнего уровня) гггг-ММ-дд HH:mm:ss[.nnnnn] [{+|-}hh:mm]

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

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

MM — это две цифры, начиная от 0112от , которые представляют месяц в указанном году.
dd — две цифры, начиная от 0131 месяца в зависимости от месяца, которые представляют день указанного месяца.
HH — это две цифры, начиная от 0023от , которые представляют час.
mm — это две цифры, начиная от 0059от , которые представляют минуту.
ss — это две цифры, начиная от 0059от , которые представляют второй.
n равно нулю до семи цифр, начиная от 09999999от , которые представляют дробные секунды.
hh — это две цифры, которые варьируются от -14 до +14.
mm — это две цифры, которые варьируются от 00 до 59.
Длина символа Минимум 26 позиций (гггг-ММ-дд HH:mm:ss {+|-}hh:mm) до 34 максимум (гггг-ММ-дд ЧЧ:мм:ss.nnnnn {+|-}hh:mm)
Точность, масштабирование См. следующую таблицу.
Размер хранилища 10 байт, исправлено значение по умолчанию с точностью 100-ns дробной секунды.
Точность 100 наносекунд
Значение по умолчанию 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. Сведения о алфавитных, числовых, неуправляемых и временных форматах для частей даты и времени даты и времени даты и времени (Transact-SQL) и времени (Transact-SQL).

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

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

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

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

  • hh — это две цифры, которые варьируются от 0014 до и представляют количество часов в смещение часового пояса.

  • mm — это две цифры, начиная от 0059от , которые представляют количество дополнительных минут в смещение часового пояса.

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

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

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

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

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

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

Синтаксис преобразования часовых поясов

SQL Server 2016 (13.x) представил AT TIME ZONE синтаксис для упрощения преобразования часового пояса с поддержкой дневного времени. Этот синтаксис особенно полезен при преобразовании данных без смещения часового пояса в данные с смещениями часового пояса. Сведения о преобразовании в соответствующее значение datetimeoffset в целевом часовом поясе см. в разделе AT TIME ZONE.

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

Разделы соответствия ТРЕБОВАНИЯМ ANSI и ISO 8601 в статьях о дате и времени применяются к datetimeoffset.

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

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

Тип данных SQL Server Формат строкового литерала по умолчанию, передаваемый клиенту низкого уровня ODBC низкого уровня OLEDB низкого уровня JDBC низкого уровня SQLCLIENT низкого уровня
time HH:mm:ss[.nnnnnnnnn] SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String или SqString
date гггг-ММ-дд SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String или SqString
datetime2 гггг-ММ-дд HH:mm:ss[.nnnnnnnnn] SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String или SqString
datetimeoffset гггг-ММ-дд HH:mm:ss[.nnnnn] [+|-]hh:mm SQL_WVARCHAR или SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String или SqString

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

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

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

В этом разделе приведен пример обновления данных из типа данных без смещения до нового столбца типа данных datetimeoffset .

Сначала проверьте имя часового пояса из представления системного каталога sys.time_zone_info .

SELECT * FROM sys.time_zone_info WHERE name = 'Pacific Standard Time';

В следующем примере используется синтаксис AT TIME ZONE дважды. Пример кода создает таблицу dbo.Audit, добавляет данные, охватывающие несколько изменений в летнее время, и добавляет новый столбец datetimeoffset . Предположим, что AuditCreated столбец является типом данных *datetime2 без смещения и написан с помощью часового пояса UTC.

UPDATE В инструкции AT TIME ZONE синтаксис сначала добавляет смещение часового пояса UTC к существующим AuditCreated данным столбца, а затем преобразует данные из UTC Pacific Standard Timeв правильное изменение исторических данных для каждого диапазона времени летнего времени в США.

CREATE TABLE dbo.Audit (AuditCreated DATETIME2(0) NOT NULL);
GO

INSERT INTO dbo.Audit (AuditCreated)
VALUES ('1/1/2024 12:00:00');

INSERT INTO dbo.Audit (AuditCreated)
VALUES ('5/1/2024 12:00:00');

INSERT INTO dbo.Audit (AuditCreated)
VALUES ('12/1/2024 12:00:00');
GO

ALTER TABLE dbo.Audit
ADD AuditCreatedOffset DATETIMEOFFSET(0) NULL;
GO

DECLARE @TimeZone VARCHAR(50);

SELECT @TimeZone = [name]
FROM sys.time_zone_info
WHERE [name] = 'Pacific Standard Time';

UPDATE dbo.Audit
SET AuditCreatedOffset = AuditCreated
    AT TIME ZONE 'UTC' AT TIME ZONE @TimeZone
WHERE AuditCreatedOffset IS NULL;
GO

SELECT *
FROM dbo.Audit;

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

AuditCreated         AuditCreatedOffset
-------------------  --------------------------
2024-01-01 12:00:00  2024-01-01 04:00:00 -08:00
2024-05-01 12:00:00  2024-05-01 05:00:00 -07:00
2024-12-01 12:00:00  2024-12-01 04:00:00 -08:00

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

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

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

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

Если преобразование равно времени(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 вызывает неявное преобразование между датой и этим типом, как определено правилами преобразования.
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 Простейший.