datetimeoffset (Transact-SQL)

Определяет дату, объединенную со временем дня, с учетом часового пояса в 24-часовом формате.

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

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

Свойство

Значение

Синтаксис

datetimeoffset [ (fractional seconds precision) ]

Использование

DECLARE @MyDatetimeoffset datetimeoffset(7)

CREATE TABLE Таблица1 (столбец1 datetimeoffset(7) )

Форматы строковых литералов по умолчанию (используются для клиента нижнего уровня)

ГГГГ-ММ-ДД чч:мм:сс[. ннннннн] [{+|-}чч:мм]

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

Диапазон даты

От 0001-01-01 до 9999-12-31

От 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 позиций (ГГГГ-ММ-ДД чч:мм:сс {+|-}чч:мм) до 34 позиций (ГГГГ-ММ-ДД чч:мм:сс. ннннннн {+|-}чч:мм)

Точность, масштаб

Указанный масштаб

Результат (точность, масштаб)

Длина столбца (в байтах)

Точность в долях секунды

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

Объем памяти

10 байт, по умолчанию используется фиксированная точность 100 нс.

Точность

100 наносекунд

Значение по умолчанию

1900-01-01 00:00:00 00:00

Календарь

Григорианский

Определяемая пользователем точность в долях секунды

Yes

Учет и сохранение смещения часового пояса

Yes

Учет перехода на летнее время

Нет

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

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

ISO 8601

Описание

ГГГГ-ММ-ДДТчч:мм:сс[. ннннннн][{+|-}чч:мм]

На эти два формата не влияют настройки локали сеанса инструкций 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.

Соответствие стандартам 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

ГГГГ-ММ-ДД чч:мм:сс[. ннннннн] [+|-]чч:мм

SQL_WVARCHAR или SQL_VARCHAR

DBTYPE_WSTR или DBTYPE_STR

Java.sql.String

String или SqString

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

При преобразовании в типы данных даты и времени SQL Server отвергает все значения, которые он не распознает как значения даты или времени. Дополнительные сведения об использовании функций CAST и CONVERT c данными типов даты и времени см. в разделе Функции CAST и CONVERT (Transact-SQL).

Тип данных, в который выполняется преобразование

Дополнительные сведения о преобразовании

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';
--Result
--@datetimeoffset                date
-------------------------------- ----------
--2025-12-10 12:32:10.0000 +01:0 2025-12-10
--
--(1 row(s) affected)

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';
--Result
--@datetimeoffset                time
-------------------------------- ------------
-- 2025-12-10 12:32:10.1237 +01:00    12:32:10.124
--
--(1 row(s) affected)

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';
--Result
--@datetimeoffset                datetime
-------------------------------- -----------------------
--2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123
--
--(1 row(s) affected)

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';
--Result
--@datetimeoffset                @smalldatetime
-------------------------------- -----------------------
--1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
--
--(1 row(s) affected)

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';
--Result
@datetimeoffset                    @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00    1912-10-25 12:24:32.12
--(1 row(s) affected)

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

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

Преобразование строковых литералов в 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

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)