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 |
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделе:Отправить и просмотреть отзыв по