datetime2 (Transact-SQL)

 

ESTE TÓPICO APLICA-SE A: simSQL Server (começando com o 2008)simBanco de Dados SQL do AzuresimAzure SQL Data Warehouse simParallel Data Warehouse

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

PropriedadeValue
Sintaxedatetime2 [(precisão fracionária de segundos)]
UsoDECLARAR @MyDatetime2 datetime2 (7)

CRIAR TABELA Table1 (Coluna1 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 datas0001-01-01 a 9999-12-31

Janeiro 1,1 CE até 31 de dezembro de 9999 CE
Intervalo de horas00:00:00 a 23:59:59.9999999
Intervalo de deslocamento de fuso horárioNenhuma
Intervalos de elementosAAAA é 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. Em Informatica, as frações de segundo serão truncados quando n > 3.
Comprimento de caracteres19 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, escala0 a 7 dígitos, com exatidão de 100ns. A precisão padrão é 7 dígitos.
Tamanho de armazenamento6 bytes para precisões menores que 3; 7 bytes para precisões 3 e 4. Todas as outras precisões exigem 8 bytes.
Precisão100 nanossegundos
Valor padrão1900-01-01 00:00:00
CalendárioGregoriano
Precisão de segundo fracionário definida pelo usuárioSim
Preservação e reconhecimento de deslocamento de fuso horárioNão
Reconhecimento de horário de verãoNão

Para metadados de tipo de dados, consulte Sys. systypes & #40. O Transact-SQL e 41; ou TYPEPROPERTY & #40. O Transact-SQL e 41;. 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, consulte COLUMNPROPERTY & #40. O Transact-SQL e 41;, COL_LENGTH & #40. O Transact-SQL e 41;, ou Columns & #40. O Transact-SQL e 41;.

As tabelas seguintes listam os formatos com suporte ISO 8601 e ODBC cadeia de caracteres literal para datetime2. Para obter informações sobre os formatos alfabéticos, numéricos, não separados e tempo para as partes de data e hora de datetime2, consulte Data & #40. O Transact-SQL e 41; e tempo & #40. O Transact-SQL e 41;.

ISO 8601Descriçõ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 (.) são incluídos na cadeia de caracteres literal, por exemplo ' 2007-05-02T19:58:47.1234567'.
ODBCDescription
{ 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).

A conformidade ANSI e ISO 8601 de data e tempo se aplicam a datetime2.

Alguns clientes de nível inferior não dão suporte a tempo, data, datetime2 e datetimeoffset tipos de dados. 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 ServerFormato de literal de cadeia de caracteres padrão passado ao cliente de nível inferiorODBC de nível inferiorOLEDB de nível inferiorJDBC de nível inferiorSQLCLIENT de nível inferior
tempohh:mm:ss[.nnnnnnn]SQL_WVARCHAR ou SQL_VARCHARDBTYPE_WSTR ou DBTYPE_STRJava.sql.StringCadeia de caracteres ou SqString
DataAAAA-MM-DDSQL_WVARCHAR ou SQL_VARCHARDBTYPE_WSTR ou DBTYPE_STRJava.sql.StringCadeia de caracteres ou SqString
datetime2AAAA-MM-DD hh:mm:ss[.nnnnnnn]SQL_WVARCHAR ou SQL_VARCHARDBTYPE_WSTR ou DBTYPE_STRJava.sql.StringCadeia de caracteres ou SqString
DateTimeOffsetAAAA-MM-DD HH [. nnnnnnn] [+ |-] hh: mmSQL_WVARCHAR ou SQL_VARCHARDBTYPE_WSTR ou DBTYPE_STRJava.sql.StringCadeia de caracteres ou SqString

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 dados de data e hora, consulte CAST e CONVERT & #40. O Transact-SQL e 41;

Conversão de 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 para o datetime2 tipo de dados.

Quando a conversão for de data, 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 for 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 for 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 for 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 for de datetime, a data e hora são copiados. 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

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 para converter uma cadeia de caracteres literal para o datetime2 tipo de dados.

Literal de cadeia de caracteres de entradadatetime2
ODBC DATELiterais de cadeia de caracteres ODBC são mapeados para o datetime tipo de dados. Qualquer operação de atribuição de literais de ODBC DATETIME em datetime2 fará com que uma conversão implícita entre tipos datetime e esse tipo conforme definido pelas regras de conversão.
ODBC TIMEConsulte a regra de ODBC DATE anterior.
ODBC DATETIMEConsulte a regra de ODBC DATE anterior.
Apenas DATEA parte TIME assume 00:00:00 como padrão.
Apenas TIMEA parte DATE assume 1900-1-1 como padrão.
Apenas TIMEZONEOs valores padrão são fornecidos.
DATE + TIMETrivial
DATE + TIMEZONENão permitido.
TIME + TIMEZONEA parte DATE assume 1900-1-1 como padrão. A entrada TIMEZONE é ignorada.
DATE + TIME + TIMEZONEO DATETIME local será usado.

O exemplo a seguir compara os resultados da conversão de uma cadeia de caracteres para cada data e tempo 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';  

Aqui está o conjunto de resultados.

Tipo de dadosSaída
tempo12:35:29. 1234567
Data2007-05-08
smalldatetime2007-05-08 12:35:00
Data e hora2007-05-08 12:35:29.123
datetime22007-05-08 12:35:29. 1234567
DateTimeOffset2007-05-08 12:35:29.1234567 +12:15

CAST e CONVERT & #40. O Transact-SQL e 41;

Contribuições da comunidade

Mostrar: