Dados de data e hora
O SQL Server 2008 introduziu novos tipos de dados para lidar com informações de data e hora. Os novos tipos de dados incluíam tipos separados para data e hora e tipos de dados expandidos com maior alcance, precisão e reconhecimento de fuso horário. A partir do .NET Framework versão 3.5 Service Pack (SP) 1, o Provedor de Dados .NET Framework para SQL Server (System.Data.SqlClient) oferece suporte completo para todos os novos recursos do Mecanismo de Banco de Dados do SQL Server 2008. Você deve instalar o .NET Framework 3.5 SP1 (ou posterior) para usar esses novos recursos com o SqlClient.
As versões do SQL Server anteriores ao SQL Server 2008 tinham apenas dois tipos de dados para trabalhar com valores de data e temporal: datetime
e smalldatetime
. Ambos os tipos de dados contêm o valor de data e um valor temporal, o que dificulta o trabalho apenas com valores de data ou temporal. Além disso, esses tipos de dados apenas são compatíveis com datas que ocorrem após a introdução do calendário gregoriano, na Inglaterra, em 1753. Outra limitação é que esses tipos de dados mais antigos não têm reconhecimento de fuso horário, o que dificulta o trabalho usando dados provenientes de vários fusos horários.
Para obter mais informações sobre tipos de data e hora no SQL Server, consulte Tipos e Funções de Dados de Data e Hora.
Tipos de dados de data/hora introduzidos no SQL Server 2008
A tabela a seguir descreve os novos tipos de dados de data e hora.
Tipos de dados do SQL Server | Descrição |
---|---|
date |
O tipo de dados date tem um intervalo de 1º de janeiro de 01 a 31 de dezembro de 9999 com precisão de um dia. O valor padrão é 1º de janeiro de 1900. O tamanho do armazenamento é 3 bytes. |
time |
O tipo de dados time armazena somente valores temporais, com base em um relógio de 24 horas. O tipo de dados time tem um intervalo de 00:00:00.0000000 a 23:59:59,9999999 com precisão de 100 nanossegundos. O valor padrão é 00:00:00.0000000 (meia-noite). O tipo de dados time dá suporte à precisão de fração de segundo definida pelo usuário. O tamanho do armazenamento varia de 3 a 6 bytes, com base na precisão especificada. |
datetime2 |
O tipo de dados datetime2 combina o intervalo e a precisão dos tipos de dados date e time em um tipo de dados.Os valores padrão e os formatos literais de cadeia de caracteres são os mesmos que os definidos nos tipos de dados date e time . |
datetimeoffset |
O tipo de dados datetimeoffset tem todos os recursos de datetime2 com um deslocamento de fuso horário adicional. O deslocamento de fuso horário é representado como [+|-] HH:MM. HH equivale a dois dígitos, variando de 00 a 14, que representam o número de horas no deslocamento de fuso horário. MM equivale a dois dígitos, variando de 00 a 59, que representam o número de minutos adicionais no deslocamento de fuso horário. Os formatos de hora são compatíveis com 100 nanossegundos. O sinal + ou - obrigatório indica se o deslocamento de fuso horário é adicionado ou subtraído do UTC (Tempo Universal Coordenado) ou do GMT (Hora de Greenwich) para obter a hora local. |
Observação
Para obter mais informações sobre o uso da palavra-chave Type System Version
, confira ConnectionString.
Formato de data e ordem de data
O modo como o SQL Server analisa os valores de data e temporal não depende apenas da versão do sistema do tipo e da versão do servidor, mas também das configurações de formato e idioma padrão do servidor. Uma cadeia de caracteres de data que funciona para os formatos de data de um idioma poderá ser irreconhecível se a consulta for executada por uma conexão que usa uma configuração diferente de idioma e formato de data.
A instrução SET LANGUAGE do Transact-SQL define implicitamente o DATEFORMAT que determina a ordem das partes da data. Você pode usar a instrução SET DATEFORMAT do Transact-SQL em uma conexão para eliminar a ambiguidade dos valores de data ordenando as partes da data na ordem MDA, DMA, AMD, ADM, MAD ou DAM.
Se você não especificar nenhum DATEFORMAT para a conexão, o SQL Server usará o idioma padrão associado à conexão. Por exemplo, uma cadeia de caracteres de data de '01/02/03' seria interpretada como MDA (2 de janeiro de 2003) em um servidor com uma configuração de idioma de inglês dos Estados Unidos e como DMA (1º de fevereiro de 2003) em um servidor com uma configuração de idioma de inglês britânico. O ano é determinado usando a regra de ano limiar do SQL Server, que define a data limiar para atribuir o valor do século. Para obter mais informações, consulte Opção de corte de ano de dois dígitos.
Observação
Não há suporte para o formato de data ADM ao converter de um formato de cadeia de caracteres para date
, time
, datetime2
ou datetimeoffset
.
Para obter mais informações sobre como o SQL Server interpreta dados de data e hora, consulte Uso de Dados de Data e Hora.
Parâmetros e tipos de dados de data/hora
As enumerações a seguir foram adicionadas ao SqlDbType para dar suporte aos novos tipos de dados de data e hora.
SqlDbType.Date
SqlDbType.Time
SqlDbType.DateTime2
SqlDbType.DateTimeOffSet
Você pode especificar o tipo de dados de um SqlParameter usando uma das enumerações SqlDbType anteriores.
Observação
Não é possível definir a propriedade DbType
de um SqlParameter
como SqlDbType.Date
.
Você também pode especificar genericamente o tipo de um SqlParameter configurando a propriedade DbType de um objeto SqlParameter
para um determinado valor de enumeração DbType. Os seguintes valores de enumeração foram adicionados ao DbType para dar suporte aos tipos de dados datetime2
e datetimeoffset
:
DbType.DateTime2
DbType.DateTimeOffset
Essas novas enumerações suplementam as enumerações Date
, Time
e DateTime
, que existiam em versões anteriores do .NET Framework.
O tipo do provedor de dados do .NET Framework de um objeto de parâmetro é inferido do tipo do .NET Framework do valor do objeto de parâmetro ou do DbType
do objeto de parâmetro. Nenhum tipo novo de dados System.Data.SqlTypes foi introduzido para dar suporte aos novos tipos de dados de data e hora. A tabela a seguir descreve os mapeamentos entre os tipos de dados de data e hora do SQL Server 2008 e os tipos de dados do CLR.
Tipos de dados do SQL Server | Tipo de .NET Framework | System.Data.SqlDbType | System.Data.DbType |
---|---|---|---|
data | System.DateTime | Data | Data |
time | System.TimeSpan | Hora | Hora |
datetime2 | System.DateTime | DateTime2 | DateTime2 |
datetimeoffset | System.DateTimeOffset | DateTimeOffset | DateTimeOffset |
DATETIME | System.DateTime | Datetime | DateTime |
smalldatetime | System.DateTime | Datetime | DateTime |
Propriedades do SqlParameter
A tabela a seguir descreve as propriedades SqlParameter
que são relevantes para os tipos de dados de data e hora.
Propriedade | Descrição |
---|---|
IsNullable | Obtém ou define se um valor é anulável. Quando você envia um valor de parâmetro nulo para o servidor, deve especificar DBNull, não null (Nothing no Visual Basic). Para obter mais informações sobre nulos de banco de dados, confira Como Lidar com Valores Nulos. |
Precision | Obtém ou define o número máximo de dígitos usados para representar o valor. Essa configuração é ignorada para tipos de dados de data e hora. |
Scale | Obtém ou define o número de casas decimais para as quais a parte de hora do valor é resolvida para Time , DateTime2 e DateTimeOffset . O valor padrão é 0, o que significa que a escala real é inferida do valor e enviada ao servidor. |
Size | Ignorado para tipos de dados de data e hora. |
Value | Obtém ou define o valor do parâmetro. |
SqlValue | Obtém ou define o valor do parâmetro. |
Observação
Valores temporais menores que zero ou maiores ou iguais a 24 horas lançarão um ArgumentException.
Criar parâmetros
Você pode criar um objeto SqlParameter usando o construtor ou adicionando-o a uma coleção de SqlCommandParameters chamando o método Add
do SqlParameterCollection. O método Add
usará como entrada argumentos do construtor ou um objeto de parâmetro existente.
As próximas seções neste tópico fornecem exemplos de como especificar parâmetros de data e hora. Para obter exemplos adicionais de trabalho com parâmetros, consulte Configurar Parâmetros e Tipos de Dados de Parâmetro e Parâmetros DataAdapter .
Exemplo de data
O fragmento de código a seguir demonstra como especificar um parâmetro date
.
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Date";
parameter.SqlDbType = SqlDbType.Date;
parameter.Value = "2007/12/1";
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Date"
parameter.SqlDbType = SqlDbType.Date
parameter.Value = "2007/12/1"
Exemplo de hora
O fragmento de código a seguir demonstra como especificar um parâmetro time
.
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@time";
parameter.SqlDbType = SqlDbType.Time;
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Time"
parameter.SqlDbType = SqlDbType.Time
parameter.Value = DateTime.Parse("23:59:59").TimeOfDay;
Exemplo de Datetime2
O fragmento de código a seguir demonstra como especificar um parâmetro datetime2
com as partes de data e hora.
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@Datetime2";
parameter.SqlDbType = SqlDbType.DateTime2;
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@Datetime2"
parameter.SqlDbType = SqlDbType.DateTime2
parameter.Value = DateTime.Parse("1666-09-02 1:00:00");
Exemplo de DateTimeOffSet
O fragmento de código a seguir demonstra como especificar um parâmetro DateTimeOffSet
com uma data, uma hora e um deslocamento de fuso horário de 0.
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@DateTimeOffSet";
parameter.SqlDbType = SqlDbType.DateTimeOffSet;
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");
Dim parameter As New SqlParameter()
parameter.ParameterName = "@DateTimeOffSet"
parameter.SqlDbType = SqlDbType.DateTimeOffSet
parameter.Value = DateTimeOffset.Parse("1666-09-02 1:00:00+0");
AddWithValue
Você também pode fornecer parâmetros usando o método AddWithValue
de um SqlCommand, conforme mostrado no fragmento de código a seguir. No entanto, o método AddWithValue
não permite que você especifique o DbType ou o SqlDbType para o parâmetro.
command.Parameters.AddWithValue(
"@date", DateTimeOffset.Parse("16660902"));
command.Parameters.AddWithValue( _
"@date", DateTimeOffset.Parse("16660902"))
O parâmetro @date
pode mapear para um tipo de dados date
, datetime
ou datetime2
no servidor. Ao trabalhar com os novos tipos de dados datetime
, você deve definir explicitamente a propriedade SqlDbType do parâmetro como o tipo de dados da instância. Usar Variant ou fornecer valores de parâmetro implicitamente pode causar problemas com a compatibilidade com versões anteriores com os tipos de dados datetime
e smalldatetime
.
A seguinte tabela mostra quais SqlDbTypes
são inferidos de quais tipos CLR:
Tipo CLR | SqlDbType inferido |
---|---|
Datetime | SqlDbType.DateTime |
TimeSpan | SqlDbType.Time |
DateTimeOffset | SqlDbType.DateTimeOffset |
Recuperando dados de data e hora
A tabela a seguir descreve os métodos que são usados para recuperar os valores de data e hora do SQL Server 2008.
Método SqlClient | Descrição |
---|---|
GetDateTime | Recupera o valor da coluna especificada como uma estrutura DateTime. |
GetDateTimeOffset | Recupera o valor da coluna especificada como uma estrutura DateTimeOffset. |
GetProviderSpecificFieldType | Retorna o tipo que é o tipo específico do provedor subjacente para o campo. Retorna os mesmos tipos que GetFieldType para novos tipos de data e hora. |
GetProviderSpecificValue | Recupera o valor da coluna especificada. Retorna os mesmos tipos que GetValue para novos tipos de data e hora. |
GetProviderSpecificValues | Recupera os valores na matriz especificada. |
GetSqlString | Recupera o valor da coluna como um SqlString. Um InvalidCastException ocorrerá se os dados não puderem ser expressos como um SqlString . |
GetSqlValue | Recupera os dados da coluna como seu SqlDbType padrão. Retorna os mesmos tipos que GetValue para novos tipos de data e hora. |
GetSqlValues | Recupera os valores na matriz especificada. |
GetString | Recupera o valor da coluna como uma cadeia de caracteres se a versão do sistema do tipo está definida como SQL Server 2005. Um InvalidCastException ocorrerá se os dados não puderem ser expressos como uma cadeia de caracteres. |
GetTimeSpan | Recupera o valor da coluna especificada como uma estrutura TimeSpan. |
GetValue | Recupera o valor da coluna especificada como seu tipo CLR subjacente. |
GetValues | Recupera valores de coluna em uma matriz. |
GetSchemaTable | Retorna um DataTable que descreve os metadados do conjunto de resultados. |
Observação
Os novos SqlDbTypes
de data e hora não são compatíveis com o código que está executando em processo no SQL Server. Uma exceção será gerada se um desses tipos for passado para o servidor.
Especificando valores de data e hora como literais
Você pode especificar tipos de dados de data e hora usando uma variedade de formatos de cadeia de caracteres literais diferentes, que, em seguida, o SQL Server avalia no tempo de execução, convertendo-os em estruturas de data/hora internas. O SQL Server reconhece dados de data e hora que estão entre aspas simples ('). Os seguintes exemplos demonstram alguns formatos:
Formatos de datas alfabéticos, como
'October 15, 2006'
.Formatos de datas numéricos, como
'10/15/2006'
.Formatos de cadeia de caracteres não separados, como
'20061015'
, que serão interpretados como 15 de outubro de 2006 se você estiver usando o formato de data padrão ISO.
Valores temporais menores que zero ou maiores ou iguais a 24 horas lançarão um ArgumentException.
Recursos de documentos do SQL Server
Para obter mais informações sobre como trabalhar com valores de data e hora no SQL Server, consulte os artigos a seguir.
Artigo | Descrição |
---|---|
tipos de dados e funções de data e hora (Transact-SQL) | Fornece uma visão geral de todos os tipos de dados e as funções de data e hora do Transact-SQL. |
Usando dados de data e hora | Fornece informações sobre as funções e os tipos de dados de data e hora e exemplos de como usá-los. |
Tipos de dados (Transact-SQL) | Descreve os tipos de dados de sistema no SQL Server. |