SQL Server - T-SQL - Trabalhando com data e hora
Este artigo aborda o tratamento de datas e hora pelo SQL Server (estou usando a versão 2012 Express ) de uma forma suscinta, prática e objetiva. |
O SQL Server possui vários tipos diferentes para tratar data e hora com diferentes níveis de intervalo e precisão (e diferentes níveis de espaço de armazenamento requeridos).
Possui também numerosas funções para retornar, modificar e validar os dados a partir destes tipos de dados em vários formatos.
Abaixo vemos uma tabela que mostra vários tipos de data/hora para o SQL Server:
Tipo de Dados | Formato | Intervalo | Precisão | Tamanho Armazenamento (bytes) |
Time | hh:mm:ss[.nnnnnnn] |
00:00:00.0000000 até 23:59:59.9999999 |
100 nano segundos | 3 até 5 |
Date | YYYY-MM-DD | 0001–01–01 até 9999–12–31 | 1 dia | 3 |
Smalldatetime | YYYY-MM-DD hh:mm:ss | 1900–01–01 até 2079–06–06 | 1 minuto | 4 |
DateTime | YYYY-MM-DD hh:mm:ss[.nnn] | 1753–01–01 até 9999–12–31 | 0,00333 segundo | 8 |
datetime2 | YYYY-MM-DD hh:mm:ss[.nnnnnnn] |
0001–01–01 00:00:00.0000000 até 9999–12–31 23:59:59.9999999 |
100 nano segundos | 6 até 8 |
Datetimeoffset | YYYY-MM-DD hh:mm:ss[.nnnnnnn][+|-]hh:mm |
0001–01–01 00:00:00.0000000 até 9999–12–31 23:59:59.9999999 (in UTC) |
100 nano segundos | 8 até 10 |
Vamos agora mostrar algumas funções que tratam data e hora usando a sintaxe T-SQL.
Estou usando o SQL Server Management Studio Express Edition :
Para
executar as consultas abra o SQL Server Management Studio, efetue o login e a
seguir clique em New Query ou tecle CTRL+N.
Será aberta a janela para você digitar a consulta T-SQL.
Após digitar clique em Execute e veja o na janela logo abaixo.
Agora vamos ao trabalho:
1- Retornando a data e hora atual |
Para
retornar a data e hora atual podemos usar as funções
GETDATE, GETUTCDATE, CURRENT_TIMESTAMP,
SYSDATETIME, SYSUTCDATETIME, or SYSDATETIMEOFFSET
- GETDATE e CURRENT_TIMESTAMP retornam a data e hora local em um tipo de dados datetime. - GETUTCDATE retorna a hora UTC também no tipo de dados datetime.- SYSDATETIME retorna a data e hora local no tipo de dados datetime2. - SYSUTCDATETIME retorna a hora UTC também no tipo de dados datetime2. - SYSDATETIMEOFFSET retorna a hora local mais o numero de horas e minutos de deslocamento do UTC no tipo de dados datetimeoffset.
|
UTC - significa 'Universal Time Coordinate" ou 'Tempo Universal Coordenado' , também conhecido como tempo civil, é o fuso horário de referência a partir do qual se calculam todas as outras zonas horárias do mundo. Corresponde à hora de inverno de Portugal Continental e Arquipélago da Madeira e à hora de verão do Arquipélago dos Açores.
É o sucessor do Tempo Médio de Greenwich (Greenwich Mean Time), cuja sigla é GMT. A nova denominação foi cunhada para eliminar a inclusão de uma localização específica num padrão internacional, assim como para basear a medida do tempo nos padrões atômicos, mais do que nos celestes. ( http://pt.wikipedia.org/wiki/Tempo_Universal_Coordenado)
2- Incrementando e decrementando valores em uma data |
Para adicionar ou subtrair um intervalo de data ou hora em um valor para data utilize a função DATEADD.
SELECT
DATEADD(YEAR,
-1,
'2013-04-02T00:00:00');
-> Subtrai um ano da data
informada SELECT DATEADD(YEAR, +1, '2014-04-02T00:00:00'); -> Adiciona um ano à data informadaSELECT DATEADD(Day, 1, '2014-04-29T00:00:00'); -> Adiciona um dia da dataSELECT DATEADD(Month, -1, '2014-04-29T00:00:00'); -> Subtrai um mês da dataSELECT DATEADD(hour , +1, '2014-04-29T00:00:00'); -> Adiciona uma hora à data
|
Sintaxe : DATEAD (datepart, número, data)
Retorna uma data especificada com o intervalo número especificado (inteiro com sinal) adicionado à datepart especificada dessa data.
A função DATEADD usa 3 parâmetros :
1- O primeiro parâmetro é a parte da data a modificar. Os valores usados estão na tabela abaixo:
DatePart | Abreviação |
Year | yy, yyyy |
quarter | qq, q |
month | mm, m |
dayofyear | dy, y |
Day | dd, d |
week | wk, ww |
weekday | dw, w |
hour | hh |
minute | min, n |
second | ss, s |
milisecond | ms |
microsecond | mcs |
nanosecond | ns |
2- O segundo parâmetro é o valor numérico para o número de de unidades dateparts que estamos adicionando/subtraindo do valor da data. (valores negativos subtraem as unidades das datas).
3- O terceiro
parâmetro é a data a ser modificada.
Nota:
- O tipo de dados de retorno é o tipo de dados do argumento date, com exceção de
literais de cadeia de caracteres.
- O tipo de dados de retorno para um literal de cadeia de caracteres é
datetime.
- Um erro será gerado se a escala de segundos do literal de cadeia de caracteres
tiver mais de três posições (nnn) ou contiver a parte de deslocamento do fuso
horário.
3 - Encontrando a diferença entre duas datas |
Para calcular a
diferença entre duas datas utilize a função DATEDIFF.
Sintaxe : DATEDIFF ( datepart , startdate , enddate )
A função retorna a contagem (inteiro com sinal) dos limites especificados de datepart cruzados entre os parâmetros especificados startdate e enddate.
Neste exemplo eu estou usando o banco de dados Northwind.mdf e calculando a diferença entre a data de hoje e data armazenada no campo ShippedDate da tabela Orders em dias.
Sintaxe:
DATEDIFF ( datepart , startdate , enddate )
A função DATEDIFF aceita três parâmetros:
|
Note que a função retorna o número de limites datepart cruzados o que não é a mesma coisa que o tempo decorrido entre as duas datas.
A seguir temos dois exemplos de consultas onde cada coluna retorna a quantidade de um limite datepart cruzado para cada datepart especificado, embora a diferença entre as duas datas seja de 100 nano segundos (0,000001 segundos).
SELECT
DATEDIFF(year,
'2005-12-31
23:59:59.9999999',
'2006-01-01
00:00:00.0000000'); SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
|
|
Exemplo de consulta | Exemplo de Consultas usando diferentes dateparts. |
- Cada
datepart e suas abreviações retornam o mesmo valor.
- Se o valor de retorno estiver fora do intervalo de int (-2,147,483,648 a
+2,147,483,647), um erro será retornado.
- Para millisecond, a diferença máxima entre
startdate e enddate é de 24 dias, 20 horas,
31 minutos e 23.647 segundos.
- Para second, a diferença máximo é de 68 anos.
- Se a startdate e enddate
forem atribuídos apenas um valor de hora e o datepart não for um datepart de
hora, será retornado 0.
- Se apenas um valor de hora for atribuído a uma variável de tipo de dados
'data', o valor da parte 'data' faltante será definido como o padrão: 1900-01-01
4- Exibindo o valor string de parte de uma data |
Para obter o nome do mês e dia da semana para uma data específica utilize a função DATENAME.
A função DATENAME retorna uma cadeia de caracteres que representa o datepart especificado da date especificada.
Sintaxe: DATENAME ( datepart , date )
O valor do retorno depende do ambiente de idioma definido usando SET LANGUAGE.
No exemplo abaixo a consulta SQL retorna o nome do mês e o nome do dia da semana para o campo RequiredDate da tabela Orders do banco de dados Northwind.mdf.
Note que usamos a instrução SET LANGUAGE definindo o idioma como Português.
- A configuração de SET LANGUAGE é definida no momento da execução e não no momento da análise.
- SET LANGUAGE define implicitamente a configuração de SET DATEFORMAT.
5- Determinando o último dia do mês |
Para saber o último dia do mês de uma data utilize a função EOMONTH.
A função EOMONTH retorna o último dia do mês que contém a data especificada com um deslocamento opcional.
Sintaxe: EOMONTH ( start_date [, month_to_add ] )
Na consulta SQL baixo usamos a função EOMONTH para obter o último dia do mês de uma data para o mês atual e para o mês seguinte.
Essa função pode ser remota para servidores SQL Server 2012 e posteriores. Ela não pode ser remota para servidores com versão anterior a SQL Server 2012.
E com isso concluímos esta etapa mostrando algumas funções T-SQL para tratar datas no SQL Server.
Aguarde outro artigo sobre o assunto em breve.
Filipenses 2:14 Fazei todas as coisas sem murmurações nem contendas;
Filipenses 2:15 para que vos torneis irrepreensíveis e sinceros, filhos de Deus imaculados no meio de uma geração corrupta e perversa, entre a qual resplandeceis como luminares no mundo,
Filipenses 2:16 retendo a palavra da vida; para que no dia de Cristo eu tenha motivo de gloriar-me de que não foi em vão que corri nem em vão que trabalhei.
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
|
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências: