Partilhar via


datatempooffset (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Define uma data que é combinada com uma hora de um dia com base em um relógio de 24 horas como datetime2 e adiciona reconhecimento de fuso horário com base no Tempo Universal Coordenado (UTC).

Descrição do DateTimeOffset

Property Value
Syntax DATETIMEOFFSET [ (precisão de segundos fracionários ) ]
Usage DECLARE @MyDatetimeoffset DATETIMEOFFSET(7);
CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7));
Formatos literais 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 para clientes de nível inferior a seguir.
Intervalo de datas 0001-01-01 através 9999-12-31

1 de janeiro de 1 d.C. a 31 de dezembro de 9999 d.C.
Intervalo de tempo 00:00:00 através 23:59:59.9999999
Intervalo de deslocamento de fuso horário -14:00 através +14:00
Intervalos de elementos yyyy são quatro dígitos, que variam de 0001 até 9999, que representam um ano.

MM são dois dígitos, variando de 01 a 12, que representam um mês no 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 representam os segundos fracionários.
hh são dois dígitos que variam de -14 até +14.
mm são dois dígitos que variam de 00 até 59.
Comprimento do caractere Mínimo de 26 posições (aaaa-MM-dd HH:mm:ss {+|-}hh:mm) a máximo de 34 posições (aaaa-MM-dd HH:mm:ss.nnnnnnn {+|-}hh:mm)
Precisão, escala Veja a tabela a seguir.
Tamanho de armazenamento 10 bytes, fixo é o padrão com o padrão de 100 ns de precisão de segundo fracionário.
Accuracy 100 nanossegundos
Valor predefinido 1900-01-01 00:00:00 00:00
Calendar Gregorian
de precisão de segundo fracionário definido pelo usuário Yes
Reconhecimento de compensação de fuso horário e preservação Yes
Horário de verão ciente No
Escala especificada Resultado (precisão, escala) Comprimento da coluna (bytes) Precisão de segundos fracionários
datetimeoffset (34, 7) 10 7
datetimeoffset(0) (26, 0) 8 0 a 2
datetimeoffset(1) (28, 1) 8 0 a 2
datetimeoffset(2) (29, 2) 8 0 a 2
datetimeoffset(3) (30, 3) 9 3 a 4 anos
datetimeoffset(4) (31, 4) 9 3 a 4 anos
datetimeoffset(5) (32, 5) 10 5 a 7 anos
datetimeoffset(6) (33, 6) 10 5 a 7 anos
datetimeoffset(7) (34, 7) 10 5 a 7 anos

Formatos literais de cadeia de caracteres suportados para datetimeoffset

A tabela a seguir lista os formatos literais de cadeia de caracteres ISO 8601 suportados para datetimeoffset. Para obter informações sobre formatos alfabéticos, numéricos, não separados e de hora para as partes de data e hora de datetimeoffset, consulte data e hora.

Certificação ISO 8601 Description
yyyy-MM-ddTHH:mm:ss[.nnnnnnn][{+|-}hh:mm] Esses dois formatos não são afetados pelas configurações de localidade e SET LANGUAGESET DATEFORMAT sessão. Não são permitidos espaços entre as partes datetimeoffset e datetime .
aaaa-MM-ddTHH:mm:ss[.nnnnnnn]Z (UTC) Este formato por definição ISO indica que a porção datetime deve ser expressa em Tempo Universal Coordenado (UTC). Por exemplo, 1999-12-12 12:30:30.12345 -07:00 deve ser representado como 1999-12-12 19:30:30.12345Z.

O exemplo a seguir compara os resultados da conversão de uma cadeia de caracteres a cada de data e hora tipo de dados.

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 ISO8601';

Aqui está o conjunto de resultados.

Tipo de dados Output
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 ISO8601 2007-05-08 12:35:29.1234567 +12:15

Deslocamento de fuso horário

Um deslocamento de fuso horário especifica o deslocamento de zona do UTC para um valor de hora ou data/hora . O deslocamento de fuso horário pode ser representado como [+|-] hh:mm:

  • hh são dois dígitos que variam de 00 para 14 e 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) é o sinal obrigatório para uma compensação de fuso horário. Este sinal indica se o deslocamento de fuso horário é adicionado ou subtraído da hora UTC para obter a hora local. O intervalo válido de deslocamento de fuso horário é de -14:00 até +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 para +14:00.

A precisão de segundos fracionários do parâmetro de tipo opcional especifica o número de dígitos para a parte fracionária dos segundos. Este valor pode ser um número inteiro com 0 a 7 (100 nanossegundos). A precisão padrão de segundos fracionários é de 100 ns (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 é preservado no banco de dados para recuperação.

Presume-se que o desvio de fuso horário determinado reconhece o horário de verão (DST) e é ajustado para qualquer data/hora que esteja no período do horário de verão.

Para o tipo datetimeoffset , o valor datetime UTC e local (para o deslocamento de fuso horário persistente ou convertido) é validado durante as operações de inserção, atualização, aritmética, conversão ou atribuição. A deteção de qualquer valor de data/hora UTC ou local inválido (para o deslocamento de fuso horário persistente ou convertido) gera um erro de valor inválido. Por exemplo, 9999-12-31 10:10:00 é válido em UTC, mas estoura na hora local para o deslocamento +13:50de fuso horário.

Sintaxe de conversão de fuso horário

O SQL Server 2016 (13.x) introduziu a sintaxe para facilitar conversões de fuso AT TIME ZONE horário universal com reconhecimento de horário de verão. Essa sintaxe é especialmente útil ao converter dados sem deslocamentos de fuso horário em dados com deslocamentos de fuso horário. Para converter para um valor de deslocamento datetimeoffset correspondente em um fuso horário de destino, consulte AT TIME ZONE.

Conformidade com ANSI e ISO 8601

As seções de conformidade ANSI e ISO 8601 dos artigos de data e hora aplicam-se ao datetimeoffset.

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

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

Tipo de dados do SQL Server Formato literal de cadeia de caracteres padrão passado para o 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_WSTRor DBTYPE_STR Java.sql.String String ou SqString
date yyyy-MM-dd SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String ou SqString
datetime2 aaaa-MM-dd HH:mm:ss[.nnnnnnn] SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String ou SqString
datetimeoffset aaaa-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR ou SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String String ou SqString

Suporte ao Microsoft Fabric

No Microsoft Fabric, atualmente você não pode criar colunas com o tipo de dados datetimeoffset, mas pode usar datetimeoffset para converter dados com a função AT TIME ZONE , por exemplo:

SELECT CAST (CAST ('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS DATETIME2) AS PST;

No banco de dados SQL do Microsoft Fabric: a precisão de 7 dígitos pode ser usada, mas os dados espelhados no Fabric OneLake teriam o fuso horário e a sétima hora decimal cortados. Esse tipo de coluna não pode ser usado como chave primária em tabelas no banco de dados SQL de malha.

Converter dados de data e hora

Quando você converte 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 dados de data e hora, consulte CAST e CONVERT.

Converter em tipo de dados datetimeoffset

Esta seção fornece um exemplo de atualização de dados de um tipo de dados sem deslocamentos para uma nova coluna de tipo de dados datetimeoffset .

Primeiro, verifique o nome do fuso horário na exibição do catálogo do sistema sys.time_zone_info .

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

O exemplo a seguir usa a sintaxe AT TIME ZONE duas vezes. O código de exemplo cria uma tabela dbo.Audit, adiciona dados que abrangem várias alterações de horário de verão e adiciona uma nova coluna datetimeoffset . Assumimos que a AuditCreated coluna é um tipo de dados *datetime2 sem deslocamentos e foi escrita usando o fuso horário UTC.

UPDATE Na instrução, a sintaxe primeiro adiciona deslocamento de fuso AT TIME ZONE horário UTC aos dados da coluna existente AuditCreated e, em seguida, converte os dados de UTC para Pacific Standard Time, ajustando corretamente os dados históricos para cada intervalo de horário de verão passado nos Estados Unidos.

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 AS 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;

Aqui está o conjunto de resultados.

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

Converter o tipo de dados datetimeoffset em outros tipos de data e hora

Esta seção descreve o que ocorre quando um tipo de dados datetimeoffset é convertido em outros tipos de dados de data e hora.

Quando você converte para data, o ano, mês e 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 AS DATETIMEOFFSET (4) = '12-10-25 12:32:10 +01:00';
DECLARE @date AS DATE = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @date AS 'date';

Aqui está o conjunto de resultados.

@datetimeoffset                 date
------------------------------ ----------
2025-12-10 12:32:10.0000 +01:0 2025-12-10

Se a conversão for para time(n), a hora, o minuto, o segundo e os segundos fracionários 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 AS DATETIMEOFFSET (4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time AS TIME (3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';

Aqui está o conjunto de resultados.

@datetimeoffset                 time
------------------------------- ------------
2025-12-10 12:32:10.1237 +01:00 12:32:10.124

Quando você converte em datetime, os valores de data e hora são copiados e o fuso horário é truncado. Quando a precisão fracionada do valor de datetimeoffset(n) é maior 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 AS DATETIMEOFFSET (4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime AS DATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';

Aqui está o conjunto de resultados.

@datetimeoffset                datetime
------------------------------ -----------------------
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123

Para conversões para smalldatetime, a data e as horas são copiadas. Os minutos são arredondados para cima em relação ao valor de 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 AS DATETIMEOFFSET (3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime AS SMALLDATETIME = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';

Aqui está o conjunto de resultados.

@datetimeoffset                @smalldatetime
------------------------------ -----------------------
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00

Se a conversão for para datetime2(n), a data e a hora serão copiadas para o valor datetime2 e o fuso horário será truncado. Quando a precisão do valor datetime2(n) é maior do que a precisão do valor datetimeoffset(n), os segundos fracionários são truncados para ajustar. O código a seguir mostra os resultados da conversão de um valor datetimeoffset(4) em um valor datetime2(3 ).

DECLARE @datetimeoffset AS DATETIMEOFFSET (4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 AS DATETIME2 (3) = @datetimeoffset;

SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';

Aqui está o conjunto de resultados.

@datetimeoffset                    @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00    1912-10-25 12:24:32.12

Converter literais de cadeia de caracteres em datetimeoffset

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

Literal da cadeia de caracteres de entrada datetimeoffset(n)
ODBC DATE Os literais de cadeia de caracteres ODBC são mapeados para o tipo de dados datetime . Qualquer operação de atribuição de ODBC DATETIME literais em tipos datetimeoffset causa uma conversão implícita entre datetime e esse tipo, conforme definido pelas regras de conversão.
ODBC TIME Ver regra anterior ODBC DATE
ODBC DATETIME Ver regra anterior ODBC DATE
DATE apenas O TIME padrão da peça é 00:00:00. O TIMEZONE padrão para +00:00
TIME apenas O DATE padrão da peça é 1900-1-1. O TIMEZONE padrão para +00:00
TIMEZONE apenas Os valores padrão são fornecidos
DATE + TIME O TIMEZONE padrão para +00:00
DATE + TIMEZONE Não permitido
TIME + TIMEZONE O DATE padrão da peça é 1900-1-1
DATE + TIME + TIMEZONE Trivial