datetime2 (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Ponto de extremidade de SQL no Microsoft FabricWarehouse no Microsoft Fabric

Define uma data combinada com uma hora do dia que se baseia em um período de 24 horas. datetime2 pode ser considerada uma extensão do tipo datetime existente, que tem um intervalo maior de datas, uma precisão fracionária padrão mais ampla e precisão opcional especificada pelo usuário.

Descrição de datetime2

Propriedade Valor
Sintaxe datetime2 [ (precisão de segundos fracionários) ]
Uso DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Table1 ( Column1 datetime2(7) )
Formato literal de cadeia de caracteres padrão

(usado para cliente de nível inferior)
YYYY-MM-DD hh:mm:ss[segundos fracionários]

Para obter mais informações, consulte a seção Compatibilidade com versões anteriores a seguir.
Intervalo de datas 0001-01-01 a 9999-12-31

1 de janeiro de 1 CE até 31 de dezembro de 9999 CE
Intervalo de horas 00:00:00 a 23:59:59.9999999
Intervalo de deslocamento de fuso horário Nenhum
Intervalos de elementos AAAA é um número de quatro dígitos, variando de 0001 a 9.999, que representa um ano.

MM é um número de dois dígitos, variando de 01 a 12 e representa um mês no ano especificado.

DD é um número de dois dígitos, variando de 01 a 31, dependendo do mês e representa um dia do mês especificado.

hh é um número de dois dígitos, variando de 00 a 23, que representa a hora.

mm é um número de dois dígitos, variando de 00 a 59, que representa o minuto.

ss é um número de dois dígitos, variando de 00 a 59, que representa o segundo.

n* é um número de zero a sete dígitos, variando de 0 a 9999999, que representa as frações de segundo. No Informatica, os segundos fracionários serão truncados quando n > 3.
Comprimento de caracteres 19 posições no mínimo (YYYY-MM-DD hh:mm:ss ) a 27 no máximo (YYYY-MM-DD hh:mm:ss.0000000)
Precisão, escala 0 a 7 dígitos, com exatidão de 100ns. A precisão padrão é 7 dígitos.

No Microsoft Fabric, isso pode ser um inteiro de 0 a 6, sem padrão. A precisão deve ser especificada no Microsoft Fabric.
Tamanho de armazenamento 1 6 bytes para precisão menor que 3.
7 bytes para precisão de 3 ou 4.
Todas as outras precisões exigem 8 bytes.2
Precisão 100 nanossegundos
Valor padrão 1900-01-01 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 Não
Reconhecimento de horário de verão Não

1 Os valores fornecidos são para rowstore descompactada. O uso de compactação de dados ou columnstore pode alterar o tamanho do armazenamento de cada precisão. Além disso, o tamanho do armazenamento em disco e em memória pode ser diferente. Por exemplo, valores datetime2 sempre exigem 8 bytes em memória quando é usado o modo de lote.

2 Quando um valor datetime2 é convertido em um valor varbinary, um byte extra é adicionado ao valor varbinary para armazenar a precisão.

Para obter os metadados de tipo de dados, confira sys.systypes (Transact-SQL) ou TYPEPROPERTY (Transact-SQL). Precisão e escala são variáveis para alguns tipos de data e data/hora. Para obter a precisão e escala de uma coluna, confira COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL) ou sys.columns (Transact-SQL).

Formatos de literal de cadeia de caracteres compatíveis com datetime2

As tabelas a seguir listam os formatos de literal de cadeia de caracteres ISO 8601 e ODBC para datetime2. Para obter informações sobre os formatos alfabéticos, numéricos, não separados e de hora para as partes de data e hora de datetime2, confira date (Transact-SQL) e time (Transact-SQL).

ISO 8601 Descrições
AAAA-MM-DDThh:mm:ss[.nnnnnnn]

AAAA-MM-DDThh:mm:ss[.nnnnnnn]
Esse formato não é afetado pelas configurações de localidade da sessão SET LANGUAGE e SET DATEFORMAT. O T, os dois pontos (:) e o ponto final (.) são incluídos no literal de cadeia de caracteres; por exemplo, '2007-05-02T19:58:47.1234567'.
ODBCODBC Descrição
{ ts 'yyyy-mm-dd hh:mm:ss[.segundos fracionários]' } Específico de API ODBC:

O número de dígitos à esquerda do ponto decimal, que representa os segundos fracionários, pode ser especificado de 0 até 7 (100 nanossegundos).

Conformidade com o ANSI e ISO 8601

A conformidade com o ANSI e ISO 8601 de date e time se aplica a datetime2.

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 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 de data e hora

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 os dados de data e hora, confira CAST e CONVERT (Transact-SQL)

Convertendo outros tipos de data e hora no tipo de dados datetime2

Esta seção descreve o que acontece quando outros tipos de dados de data e hora são convertidos no tipo de dados datetime2.

Quando a conversão é de date, o ano, mês e dia são copiados. O componente de hora é definido como 00:00:00.0000000. O código a seguir mostra os resultados da conversão de um valor date em um valor datetime2.

DECLARE @date date = '12-21-16';
DECLARE @datetime2 datetime2 = @date;

SELECT @datetime2 AS '@datetime2', @date AS '@date';
  
--Result  
--@datetime2                  @date
----------------------------- ----------
--2016-12-21 00:00:00.0000000 2016-12-21

Quando a conversão é de time(n), o componente de hora é copiado e o componente de data é definido como '1900-01-01'. O exemplo a seguir mostra os resultados da conversão de um valor time(7) em um valor datetime2.

DECLARE @time time(7) = '12:10:16.1234567';
DECLARE @datetime2 datetime2 = @time;

SELECT @datetime2 AS '@datetime2', @time AS '@time';
  
--Result  
--@datetime2                  @time
----------------------------- ----------------
--1900-01-01 12:10:16.1234567 12:10:16.1234567

Quando a conversão é de smalldatetime, as horas e os minutos são copiados. Os segundos e as frações de segundo são definidos como 0. O código a seguir mostra os resultados da conversão de um valor smalldatetime em um valor datetime2.

DECLARE @smalldatetime smalldatetime = '12-01-16 12:32';
DECLARE @datetime2 datetime2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime'; 
  
--Result  
--@datetime2                  @smalldatetime
----------------------------- -----------------------
--2016-12-01 12:32:00.0000000 2016-12-01 12:32:00 

Quando a conversão é de datetimeoffset(n), os componentes de data e hora são copiados. O fuso horário é truncado. O exemplo a seguir mostra os resultados da conversão de um valor datetimeoffset(7) em um valor datetime2.

DECLARE @datetimeoffset datetimeoffset(7) = '2016-10-23 12:45:37.1234567 +10:0';
DECLARE @datetime2 datetime2 = @datetimeoffset;

SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset'; 
  
--Result  
--@datetime2                  @datetimeoffset
----------------------------- ----------------------------------
--2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

Quando a conversão é de datetime, a data e hora são copiadas. A precisão fracionária é estendida para 7 dígitos. O exemplo a seguir mostra os resultados da conversão de um valor datetime em um valor datetime2.

DECLARE @datetime datetime = '2016-10-23 12:45:37.333';
DECLARE @datetime2 datetime2 = @datetime;

SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
   
--Result  
--@datetime2                  @datetime
------------------------- ---------------------------
--2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

Observação

No nível de compatibilidade 130 do banco de dados, as conversões implícitas de tipos de dados datetime para datetime2 demonstram precisão aprimorada ao considerar os milissegundos fracionários. Isso resulta em diferentes valores convertidos, conforme visto no exemplo abaixo. Use conversão explícita para o tipo de dados datetime2 sempre que existir um cenário misto de comparação entre os tipos de dados datetime e datetime2. Para obter mais informações, consulte este Artigo do Suporte da Microsoft.

Convertendo literais de cadeia de caracteres em datetime2

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. 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 datetime2.

Literal de cadeia de caracteres de entrada datetime2(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 literais de ODBC DATETIME em tipos datetime2 causará 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.
Apenas DATE A parte TIME assume 00:00:00 como padrão.
Apenas TIME A parte DATE assume 1900-1-1 como padrão.
Apenas TIMEZONE Os valores padrão são fornecidos.
DATE + TIME Trivial
DATE + TIMEZONE Não permitido.
TIME + TIMEZONE A parte DATE assume 1900-1-1 como padrão. A entrada TIMEZONE é ignorada.
DATE + TIME + TIMEZONE O DATETIME local será usado.

Exemplos

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

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

Confira também

CAST e CONVERT (Transact-SQL)