datetimeoffset (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric
Определяет дату, которая объединяется с временем дня на основе 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 — это две цифры, начиная от 01 12 от , которые представляют месяц в указанном году.dd — две цифры, начиная от 01 31 месяца в зависимости от месяца, которые представляют день указанного месяца.HH — это две цифры, начиная от 00 23 от , которые представляют час.mm — это две цифры, начиная от 00 59 от , которые представляют минуту.ss — это две цифры, начиная от 00 59 от , которые представляют второй.n равно нулю до семи цифр, начиная от 0 9999999 от , которые представляют дробные секунды.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 |
Календарь | Григорианский |
Определяемая пользователем дробная вторая точность | Да |
Смещение часового пояса с учетом и сохранением | Да |
С учетом дневного света | 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
— это две цифры, которые варьируются от00
14
до и представляют количество часов в смещение часового пояса.mm
— это две цифры, начиная от00
59
от , которые представляют количество дополнительных минут в смещение часового пояса.+
(плюс) или-
(минус) является обязательным знаком смещения часового пояса. Этот знак указывает, добавляется ли смещение часового пояса или вычитается из времени 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 |
Поддержка Microsoft Fabric
В Microsoft Fabric в настоящее время нельзя создавать столбцы с типом данных datetimeoffset , но можно использовать datetimeoffset для преобразования данных с помощью функции AT TIME ZONE (Transact-SQL), например:
SELECT
CAST(CAST('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS datetime2) AS PST
Преобразование данных даты и времени
При преобразовании в типы данных даты и времени 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 |
Простейший. |