datetime2 (Transact-SQL)

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

Value

Sintaxe

datetime2 [ (fractional seconds precision) ]

Uso

DECLARE @MyDatetime2 datetime2(7)

Tabela 1 CREATE TABLE ( Coluna 1 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 de clientes de nível inferior" a seguir.

Intervalo de datas

0001-01-01 a 9999-12-31

De 1º de janeiro do ano 1 DC até 31 de dezembro de 9999

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.

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.

Tamanho de armazenamento

6 bytes para precisões menores que 3; 7 bytes para precisões 3 e 4. Todas as outras precisões exigem 8 bytes.

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

Para metadados de tipo de dados, consulte 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 precisão e escala para uma coluna, consulte COLUMNPROPERTY (Transact-SQL), COL_LENGTH (Transact-SQL), or sys.columns (Transact-SQL).

Formatos de literal de cadeia de caracteres com suporte para 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ético, numérico, não separado e de hora para as partes de data e hora de datetime2, consulte data (Transact-SQL) e hora (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'.

ODBC

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

  • No SQL Server 2012, com nível de compatibilidade definido como 10, o literal irá mapear internamente até o novo tipo de time.

Conformidade com ANSI e ISO 8601

A compatibilidade de ANSI e ISO 8601 de data e hora se aplicam 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 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 datetime2 em outros tipos de data e hora

A tabela a seguir descreve o que ocorre quando um tipo de dados datetime2 é 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 datetime2(4) em um valor date.

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1234';
DECLARE @date date = @datetime2;
SELECT @datetime2 AS '@datetime2', @date AS 'date';
--Result
--@datetime2               date
-------------------------- ----------
--2025-12-10 12:32:10.1234 2025-12-10
--
--(1 row(s) affected)

time(n)

A hora, os minutos, os segundos e as frações de segundos são copiados se a escala for a mesma e são arredondados para cima se a escala for diferente.

O código a seguir mostra os resultados da conversão de um valor datetime2(4) em um valor time(3).

DECLARE @datetime2 datetime2(4) = '12-10-25 12:32:10.1237';
DECLARE @time time(3) = @datetime2;
SELECT @datetime2 AS '@datetime2', @time AS 'time(3)';
--Result
--@datetime2                time(3) 
-------------------------- ------------
--2025-12-10 12:32:10.1234 12:32:10.124
--
--(1 row(s) affected)

datetime

Os valores de data e hora são copiados. Quando a precisão fracionária do valor datetime(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 datetime2 em um valor datetime.

DECLARE @datetime2 datetime2 = '12-10-25 12:32:10.1234567'
DECLARE @datetime datetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetime AS '@datetime';
--Result
--@datetime2                  @datetime
----------------------------- -----------------------
@datetime2             @datetime
---------------------- -----------------------
2025-12-10 12:32:10.12 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 aos segundos, e os segundos são definidos como 0.

O código a seguir mostra os resultados da conversão de um valor datetime2 em um valor smalldatetime.

DECLARE @datetime2 datetime2 = '12-10-25 12:32:30.9234567';
DECLARE @smalldatetime smalldatetime = @datetime2;
SELECT @datetime2 AS '@datetime2', @smalldatetime AS '@smalldatetime';
--Result
@datetime2             @smalldatetime
---------------------- -----------------------
2025-12-10 12:32:30.92 2025-12-10 12:33:00
(1 row(s) affected)

datetimeoffset(n)

O valor datetime2(n) é copiado para o valor datetimeoffset(n). O deslocamento de fuso horário é definido como +00:0. Quando a precisão do valor datetime2(n) é maior do que a precisão do valor datetimeoffset(n), o valor é arredondado para cima de forma a ser ajustado.

O código a seguir mostra os resultados da conversão de um valor datetime2(5) em um valor datetimeoffset(3).

D DECLARE @datetime2 datetime2(3) = '12-10-25 12:32:10.12999';
DECLARE @datetimeoffset datetimeoffset(2) = @datetime2;
SELECT @datetime2 AS '@datetime2', @datetimeoffset AS '@datetimeoffset(2)';
--Result
--@datetime2              @datetimeoffset(2)
------------------------- -----------------------------
2025-12-10 12:32:10.13           2025-12-10 12:32:10.13 +00:00
--
--(1 row(s) affected)

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

Literal de cadeia de caracteres de entrada

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

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

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)