datetimeoffset (Transact-SQL)
Aplica-se a: SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
Azure Synapse Analytics
PDW (Analytics Platform System)
Ponto de extremidade de análise do SQL
Warehouse no Microsoft Fabric
Define uma data que é combinada com uma hora do dia com base em um relógio de 24 horas, como datetime2, e adiciona reconhecimento de fuso horário com base no UTC (Tempo Universal Coordenado).
Descrição de datetimeoffset
Propriedade | Valor |
---|---|
Sintaxe | DATETIMEOFFSET [ ( precisão de segundos fracionários ) ] |
Uso | 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 por 9999-12-31 1 de janeiro de 1 CE até 31 de dezembro de 9999 CE |
Intervalo de tempo | 00:00:00 por 23:59:59.9999999 |
Intervalo de deslocamento de fuso horário | -14:00 por +14:00 |
Intervalos de elementos | yyyy é de quatro dígitos, variando de 0001 a 9999 , que representam um ano.MM é de dois dígitos, variando de 01 a 12 , que representam um mês no ano especificado.dd é dois dígitos, variando de 01 a 31 dependendo do mês, que representam um dia do mês especificado.HH é 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 é dois dígitos, variando de 00 a 59 , que representam o segundo.n é de zero a sete dígitos, variando de a 9999999 , que representam as frações de 0 segundo.hh são dois dígitos que variam de -14 a +14 .mm são dois dígitos que variam de 00 a 59 . |
Comprimento do caractere | Mínimo de 26 posições (aaaa-MM-dd HH:mm:ss {+|-}hh:mm) a máximo de 34 (aaaa-MM-dd HH:mm:ss.nnnnnnn {+|-}hh:mm) |
Precisão, escala | Confira a tabela a seguir. |
Tamanho de armazenamento | 10 bytes, fixed é o padrão com o padrão de precisão de segundo fracionário de 100 ns. |
Precisão | 100 nanossegundos |
Valor padrão | 1900-01-01 00:00:00 00:00 |
Calendar | Gregoriano |
Precisão de segundo fracionário definida pelo usuário | Sim |
Reconhecimento e preservação do deslocamento de fuso horário | Sim |
Horário de verão ciente | Não |
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 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 |
datetimeoffset(4) | (31, 4) | 9 | 3 a 4 |
datetimeoffset(5) | (32, 5) | 10 | 5 a 7 |
datetimeoffset(6) | (33, 6) | 10 | 5 a 7 |
datetimeoffset(7) | (34, 7) | 10 | 5 a 7 |
Formatos de literal de cadeia de caracteres compatíveis com datetimeoffset
A tabela a seguir lista os formatos de literal de cadeia de caracteres ISO 8601 compatíveis com 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 (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 e SET DATEFORMAT sessãoSET LANGUAGE . 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 . |
O exemplo a seguir compara os resultados da conversão de uma cadeia de caracteres em cada tipo de dados 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';
Este é 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 |
datetimeoffset IS08601 |
2007-05-08 12:35:29.1234567 +12:15 |
Deslocamento de fuso horário
Um deslocamento de fuso horário especifica o deslocamento de fuso horário de 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 variam de00
a14
e representam o número de horas no deslocamento de fuso horário.mm
são dois dígitos, variando de00
a59
, 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. Esse 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 vai de-14:00
a+14:00
.
O intervalo de deslocamento de fuso horário segue o padrão XML do W3C para definição de esquema XSD e é um pouco diferente da definição 12:59
padrão do SQL 2003 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. Esse 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.
O deslocamento de fuso horário fornecido é considerado ciente do horário de verão (DST) e ajustado para qualquer data e hora que esteja no período de 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 detecção de qualquer valor de data e 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 transborda na hora local para o deslocamento +13:50
de fuso horário .
Sintaxe de conversão de fuso horário
O SQL Server 2016 (13.x)SQL Server 2016 (13.x)SQL Server 2016 (13.x)SQL Server 2016 (13.x)SQL Server 2016 (13.x)SQL Server 2016 (13.x)SQL AT TIME ZONE
Server 2016 (13.x)SQL Server 2016 (13.x Essa sintaxe é especialmente útil ao converter dados sem deslocamentos de fuso horário em dados com deslocamentos de fuso horário. Para converter em um valor datetimeoffset correspondente em um fuso horário de destino, consulte AT TIME ZONE.
Conformidade com o ANSI e ISO 8601
As seções de conformidade com ANSI e ISO 8601 dos artigos 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 são compatíveis com os 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 | 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 [.nnnnnnnn] | 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 (Transact-SQL), por exemplo:
SELECT
CAST(CAST('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS datetime2) AS PST
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 CAST
funções and CONVERT
com dados de data e hora, consulte CAST e CONVERT.
Converter para o 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.
Na instrução, a UPDATE
AT TIME ZONE
sintaxe primeiro adiciona o deslocamento de fuso 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 anterior 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 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;
Este é 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
A seção a seguir 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, 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 de data .
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date DATE = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @date AS 'date';
Este é 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 serão copiados. O valor de fuso horário é truncado. Quando a precisão do valor datetimeoffset(n) é maior 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';
Este é o conjunto de resultados.
@datetimeoffset time
------------------------------- ------------
2025-12-10 12:32:10.1237 +01:00 12:32:10.124
Quando você converte para 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 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';
Este é 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 em smalldatetime, a data e a hora são copiadas. Os minutos são arredondados 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';
Este é 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 que a precisão do valor datetimeoffset(n), as frações de segundo são truncadas para caber. 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';
Este é 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
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 runtime. Conversões implícitas ou conversões explícitas que não especificam um estilo, de tipos de data e hora para literais de cadeia de caracteres, estã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 do 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 somente |
O TIME padrão da peça é 00:00:00 . O TIMEZONE padrão é +00:00 |
TIME somente |
O DATE padrão da peça é 1900-1-1 . O TIMEZONE padrão é +00:00 |
TIMEZONE somente |
Os valores padrão são fornecidos |
DATE + TIME |
O TIMEZONE padrão é +00:00 |
DATE + TIMEZONE |
Não permitido |
TIME + TIMEZONE |
O padrão da parte DATE é 1900-1-1 |
DATE + TIME + TIMEZONE |
Trivial |