datetime2 (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 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[.nnnnnnn]

Para obter mais informações, consulte Compatibilidade com versões anteriores para clientes de nível inferior mais adiante neste artigo.
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 horas 00:00:00 por 23:59:59.9999999
Intervalo de deslocamento de fuso horário Nenhum
Intervalos de elementos yyyy é um número de quatro dígitos, variando de 0001 a 9999, que representa um ano.

MM é um número de dois algarismos, variando de 01 a 12, que representa um mês no ano especificado.

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

HH é um número de dois algarismos, que varia de 00 a 23, que representa a hora.

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

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

n* é um número de zero a sete dígitos de 0 até , 9999999que representa as frações de segundo. Na Informatica, as frações de segundo são truncadas quando n é menor que 3.
Comprimento de caracteres Mínimo de 19 posições (yyyy-MM-dd HH:mm:ss) a máximo de 27 (yyyy-MM-dd HH:mm:ss.0000000)
Precisão, escala 0 a 7 dígitos, com uma precisão de 100 nanossegundos (100 ns). A precisão padrão é 7 dígitos.

No Microsoft Fabric, essa precisão pode ser um número 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ão requerem 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 para cada precisão. Além disso, o tamanho do armazenamento no disco e na 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 metadados de tipo de dados, consulte sys.systypes ou TYPEPROPERTY. Precisão e escala são variáveis para alguns tipos de data e data/hora. Para obter a precisão e a escala de uma coluna, consulte COLUMNPROPERTY, COL_LENGTH ou sys.columns.

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 formatos alfabéticos, numéricos, não separados e de hora para as partes de data e hora de datetime2, consulte data e hora.

ISO 8601 Descrições
yyyy-MM-ddTHH:mm:ss[.nnnnnnn] Esse formato não é afetado pelas configurações de localidade e SET DATEFORMAT sessãoSET LANGUAGE. O T, os dois-pontos (:) e o ponto (.) são incluídos no literal de string, por exemplo 2024-05-02T19:58:47.1234567.
ODBCODBC Descrição
{ ts 'yyyy-MM-dd HH:mm:ss[.nnnnnnn]' } 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 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_WSTR ou DBTYPE_STR Java.sql.String Cadeia de caracteres ou SqString
date yyyy-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

Converter dados de data e hora

Quando você converte em tipos de dados de data e hora, o Mecanismo de Banco de Dados 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 outros tipos de data e hora para o 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 AS DATE = '12-21-16';

DECLARE @datetime2 AS DATETIME2 = @date;

SELECT @datetime2 AS '@datetime2',
       @date AS '@date';

Veja a seguir o conjunto de resultados.

@datetime2                  @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21

Quando a conversão é de time(n), o componente de tempo é 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 AS TIME (7) = '12:10:16.1234567';

DECLARE @datetime2 AS DATETIME2 = @time;

SELECT @datetime2 AS '@datetime2',
       @time AS '@time';

Veja a seguir o conjunto de resultados.

@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 AS SMALLDATETIME = '12-01-16 12:32';

DECLARE @datetime2 AS DATETIME2 = @smalldatetime;

SELECT @datetime2 AS '@datetime2',
       @smalldatetime AS '@smalldatetime';

Veja a seguir o conjunto de resultados.

@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 AS DATETIMEOFFSET (7) = '2016-10-23 12:45:37.1234567 +10:0';

DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;

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

Veja a seguir o conjunto de resultados.

@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 AS DATETIME = '2016-10-23 12:45:37.333';

DECLARE @datetime2 AS DATETIME2 = @datetime;

SELECT @datetime2 AS '@datetime2',
       @datetime AS '@datetime';

Veja a seguir o conjunto de resultados.

@datetime2                  @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

Converter explicitamente para datetime2 ao usar datetime

No nível de compatibilidade do banco de dados 130 e superior, as conversões implícitas de datetime para datetime2 mostram precisão aprimorada ao contabilizar os milissegundos fracionários, resultando em diferentes valores convertidos, como visto no exemplo anterior. Use a conversão explícita para o tipo de dados datetime2 sempre que existir um cenário de comparação mista entre os tipos de dados datetime e datetime2 . Para obter mais informações, consulte Melhorias no SQL Server e no Banco de Dados SQL do Azure no tratamento de alguns tipos de dados e operações incomuns.

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

Literal de cadeia de caracteres de entrada datahora2(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 datetime2 causa uma conversão implícita entre datetime e esse tipo, conforme definido pelas regras de conversão.
ODBC TIME Veja a regra anterior ODBC DATE .
ODBC DATETIME Veja a regra anterior ODBC DATE .
DATE somente O TIME padrão da peça é 00:00:00.
TIME somente O DATE padrão da peça é 1900-01-01.
TIMEZONE somente Os valores padrão são fornecidos.
DATE + TIME Trivial.
DATE + TIMEZONE Não permitido.
TIME + TIMEZONE O DATE padrão da peça é 1900-1-1. TIMEZONE input é ignorada.
DATE + TIME + TIMEZONE O local DATETIME é 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';

Veja a seguir 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