datetimeoffset (Transact-SQL)

Define a data combinada com uma hora de um dia que possui reconhecimento de fuso horário e é baseada em um relógio de 24 horas.

Descrição datetimeoffset

Propriedade

Value

Sintaxe

datetimeoffset [ (fractional seconds precision) ]

Uso

DECLARE @MyDatetimeoffset datetimeoffset(7)

CREATE TABLE Table1 ( Column1 datetimeoffset(7) )

Formatos de literal de cadeia de caracteres padrão (usados para cliente de nível inferior)

AAAA-MM-DD hh:mm:ss[. nnnnnnn] [{+|-}hh:mm]

Para obter mais informações, consulte a seção "Compatibilidade com versões anteriores de clientes de nível inferior" a seguir.

Intervalo de datas

0001-01-01 a 9999-12-31

1º de Janeiro, 1 d.C. a 31 de dezembro de 9999 d.C.

Intervalo de horas

00:00:00 a 23:59:59.9999999

Intervalo de deslocamento de fuso horário

-14:00 a +14:00

Intervalos de elementos

AAAA são quatro dígitos, variando de 0001 a 9999, que representam um ano.

MM são dois dígitos, variando de 01 a 12, que representam um mês do ano especificado.

DD são dois dígitos, variando de 01 a 31, dependendo do mês, que representam um dia do mês especificado.

hh são dois dígitos, variando de 00 a 23, que representam a hora.

mm são dois dígitos, variando de 00 a 59, que representam o minuto.

ss são dois dígitos, variando de 00 a 59, que representam o segundo.

n* é de zero a sete dígitos, variando de 0 a 9999999, que representa as frações de segundo.

hh são dois dígitos que abrangem de -14 a +14.

mm são dois dígitos que abrangem de 00 a 59.

Comprimento de caracteres

26 posições no mínimo (AAAA-MM-DD hh:mm:ss {+|-}hh:mm) a 34 no máximo (AAAA-MM-DD hh:mm:ss. nnnnnnn {+|-}hh:mm)

Precisão, escala

Escala especificada

Resultado (precisão, escala)

Comprimento de coluna (bytes)

Precisão de segundos fracionários

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

Tamanho de armazenamento

10 bytes, fixos, é o padrão com o padrão de precisão de segundos fracionários de 100ns.

Precisão

100 nanossegundos

Valor padrão

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

Calendário

Gregoriano

Precisão de segundo fracionário definida pelo usuário

Sim

Preservação e reconhecimento de deslocamento de fuso horário

Sim

Reconhecimento de horário de verão

Não

Suporte para formatos de literal de cadeia de caracteres para datetimeoffset

A tabela a seguir lista os formatos de literal de cadeia de caracteres ISO 8601 que há suporte para datetimeoffset. Para obter informações sobre os formatos alfabéticos, numéricos, não separados e de hora para as partes de data e hora do datetimeoffset, consulte data (Transact-SQL) e hora (Transact-SQL).

ISO 8601

Descrição

AAAA-MM-DDThh:mm:ss[. nnnnnnn][{+|-}hh:mm]

Esses dois formatos não são afetados pelas configurações de localidade de sessão SET LANGUAGE e SET DATEFORMAT. Não são permitidos espaços entre as partes datetimeoffset e datetime.

AAAA-MM-DDThh:mm:ss[. nnnnnnn]Z (UTC)

Esse formato, pela definição ISO, indica que a parte de datetime deve ser expressa em UTC (tempo universal coordenado). Por exemplo, 1999-12-12 12:30:30.12345 -07:00 deve ser representado como 1999-12-12 19:30:30.12345Z.

Deslocamento de fuso horário

Um deslocamento de fuso horário especifica o local da zona UTC para um valor de time ou datetime. O deslocamento de fuso horário pode ser representado como [+|-] hh:mm:

  • hh são dois dígitos, que abrangem de 00 a 14, que representam o número de horas no deslocamento de fuso horário.

  • mm são dois dígitos, variando de 00 a 59, que representam o número de minutos adicionais no deslocamento de fuso horário.

  • + (mais) ou - (menos) são sinais obrigatórios em um deslocamento de fuso horário. Indicam se o deslocamento de fuso horário é adicionado ou subtraído da hora UTC para se obter a hora local. O intervalo válido de deslocamento de fuso horário vai de -14: 00 a +14: 00.

O intervalo de deslocamento de fuso horário segue o padrão W3C XML para definição de esquema XSD e é ligeiramente diferente da definição padrão do SQL 2003, 12:59 a +14:00.

O parâmetro de tipo opcional fractional seconds precision especifica o número de dígitos para a parte fracionária dos segundos. Esse valor pode ser um número inteiro com 0 a 7 (100 nanossegundos). O padrão fractional seconds precision é 100ns (sete dígitos para a parte fracionária dos segundos).

Os dados são armazenados no banco de dados e processados, comparados, classificados e indexados no servidor como em UTC. O deslocamento de fuso horário será preservado no banco de dados para recuperação.

Um determinado deslocamento de fuso horário será assumido como reconhecimento de DST (horário de verão) e ajustado para qualquer datetime fornecida que estiver no período de DST.

Para o tipo datetimeoffset, tanto o UTC quanto o valor datetime local (para o deslocamento de fuso horário persistente ou convertido) serão validados durante as operações insert, update, arithmetic, convert ou assign. A detecção de qualquer UTC inválido ou valor datetime local (para o deslocamento de fuso horário persistente ou convertido) causará um erro de valor inválido. Por exemplo, 9999-12-31 10:10:00 é válido no UTC, mas excede em hora local para o deslocamento de fuso horário em +13:50.

Conformidade com ANSI e ISO 8601

As seções de conformidade com ANSI e ISO 8601 de tópicos de data e hora se aplicam a datetimeoffset.

Compatibilidade com versões anteriores de clientes de nível inferior

Alguns clientes de nível inferior não dão suporte aos tipos de dados time, date, datetime2 e datetimeoffset. A tabela a seguir mostra o mapeamento de tipos entre uma instância de nível superior do SQL Server e clientes de nível inferior.

Tipos de dados do SQL Server 2012

Formato de literal de cadeia de caracteres padrão passado ao cliente de nível inferior

ODBC de nível inferior

OLEDB de nível inferior

JDBC de nível inferior

SQLCLIENT de nível inferior

time

hh:mm:ss[. nnnnnnn]

SQL_WVARCHAR ou SQL_VARCHAR

DBTYPE_WSTR ou DBTYPE_STR

Java.sql.String

Cadeia de caracteres ou SqString

date

AAAA-MM-DD

SQL_WVARCHAR ou SQL_VARCHAR

DBTYPE_WSTR ou DBTYPE_STR

Java.sql.String

Cadeia de caracteres ou SqString

datetime2

AAAA-MM-DD hh:mm:ss[. nnnnnnn]

SQL_WVARCHAR ou SQL_VARCHAR

DBTYPE_WSTR ou DBTYPE_STR

Java.sql.String

Cadeia de caracteres ou SqString

datetimeoffset

AAAA-MM-DD hh:mm:ss[. nnnnnnn] [+|-]hh:mm

SQL_WVARCHAR ou SQL_VARCHAR

DBTYPE_WSTR ou DBTYPE_STR

Java.sql.String

Cadeia de caracteres ou SqString

Convertendo dados date e time

Ao fazer a conversão em tipos de dados de data e hora, o SQL Server rejeita todos os valores que não pode reconhecer como datas ou horas. Para obter informações sobre como usar as funções CAST e CONVERT com data e hora data, consulte CAST e CONVERT (Transact-SQL)

Convertendo tipo de dados datetimeoffset em outros tipos de data e hora

A tabela a seguir descreve o que ocorre quando um tipo de dados datetimeoffset é convertido em outros tipos de dados de data e hora.

Tipo de dados para converter em

Detalhes da conversão

date

O ano, o mês e o dia são copiados.

O código a seguir mostra os resultados da conversão de um valor datetimeoffset(4) em um valor 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)

A hora, o minuto, o segundo e as frações de segundo são copiados . O valor de fuso horário é truncado. Quando a precisão do valor datetimeoffset(n) é maior do que a precisão do valor time(n), o valor é arredondado para cima.

O código a seguir mostra os resultados da conversão de um valor datetimeoffset(4) em um valor 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

Os valores de data e hora são copiados e o fuso horário é truncado. Quando a precisão fracionária do valor datetimeoffset(n) é maior do que três dígitos, o valor é truncado.

O código a seguir mostra os resultados da conversão de um valor datetimeoffset(4) em um valor 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

A data e as horas são copiadas. Os minutos são arredondados para cima em relação ao valor dos segundos, e os segundos são definidos como 0.

O código a seguir mostra os resultados da conversão de um valor datetimeoffset(3) em um valor 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)

A data e a hora são copiadas ao valor datetime2 e o fuso horário é truncado. Quando a precisão do valor datetime2(n) é maior do que datetimeoffset(n), as frações de segundos são truncadas para serem ajustadas.

O código a seguir mostra os resultados da conversão de um valor datetimeoffset(4) em um valor 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)

Convertendo literais de cadeia de caracteres em datetimeoffset

Serão permitidas conversões de literais de cadeia de caracteres para tipos de data e hora se todas as partes da cadeia de caracteres estiverem em formatos válidos. Caso contrário, será gerado um erro de tempo de execução. As conversões implícitas ou explícitas que não especificam um estilo, de tipos de data e hora em literais de cadeia de caracteres estarão no formato padrão da sessão atual. A tabela a seguir mostra as regras de conversão de uma literal de cadeia de caracteres no tipo de dados datetimeoffset.

Literal de cadeia de caracteres de entrada

datetimeoffset(n)

ODBC DATE

Os literais de cadeia de caracteres de ODBC são mapeados para o tipo de dados datetime. Qualquer operação de atribuição de literais de ODBC DATETIME em tipos datetimeoffset provocará uma conversão implícita entre datetime e esse tipo conforme definido pelas regras de conversão.

ODBC TIME

Consulte a regra de ODBC DATE anterior.

ODBC DATETIME

Consulte a regra de ODBC DATE anterior.

Somente DATE

A parte TIME assume 00:00:00 como padrão. TIMEZONE assume +00:00 como padrão.

Somente TIME

A parte DATE assume 1900-1-1 como padrão. TIMEZONE assumirá +00:00 como padrão.

Apenas TIMEZONE

Os valores padrão são fornecidos

DATE + TIME

TIMEZONE assume +00:00 como padrão.

DATE + TIMEZONE

Não permitido

TIME + TIMEZONE

A parte DATE assume 1900-1-1 como padrão.

DATE + TIME + TIMEZONE

Trivial

Exemplos

O exemplo a seguir compara os resultados da conversão de uma cadeia de caracteres para cada tipo de dados de date e 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';

Aqui está o conjunto de resultados.

Tipo de dados

Saída

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

Consulte também

Referência

CAST e CONVERT (Transact-SQL)