Manipulando Datas com SQL Server
Tags: database, sql, learning, programming
Published: 2024-03-05 22:58:24

No mundo da gestão de dados, as datas desempenham um papel crucial. Em projetos de desenvolvimento de software, análise de dados e relatórios, a habilidade de manipular e compreender informações temporais é essencial. O SQL Server, um dos sistemas de gerenciamento de banco de dados mais amplamente utilizados, oferece uma gama robusta de funções dedicadas à manipulação de datas.

Este artigo é um guia abrangente sobre as diversas funções de manipulação de datas disponíveis no SQL Server, explorando desde as simples, como GETDATE(), até as mais avançadas, como DATEADD(), DATEDIFF(), e outras. A capacidade de dominar essas funções proporciona aos desenvolvedores e analistas de dados uma ferramenta poderosa para lidar com cenários complexos relacionados a datas.

**DATEADD()**

A função DATEADD no SQL Server é utilizada para adicionar ou subtrair um intervalo de tempo especificado a partir de uma data específica. A sintaxe da função DATEADD é a seguinte:

`DATEADD(intervalo, número, data)`

Onde:

- intervalo: é a parte da data onde o número será adicionado. Esse intervalo pode ser:
     1. Ano: year, yy, yyyy
     2. Trimestre: quarter, qq, q
     3. Mês: month, mm, m
     4. Dia do ano: dayofyear, dy, y
     5. Dia: day, dd, d 
     6. Semana: week, wk, ww
     7. Dia da semana: weekday, dw
     8. Hora: hour, hh 
     9. Minuto: minute, mi, n
     10. Segundo: second, ss, s
     11. Milissegundo: millisecond, ms
     12. Microssegundo: microsecond, mcs
     13. Nanossegundo: nanosecond, ns

- número: é o número de partes da data a serem adicionadas à data especificada. Pode ser positivo (para adição) ou negativo (para subtração).

- data: é a data à qual o intervalo é adicionado.

Alguns exemplos práticos de como usar o DATEADD().

- Adição de 3 dias na data escolhida.

`SELECT DATEADD(DAY, 3, '2023-01-01') AS NovaData`

- Subtração de 3 dias na data escolhida.

`SELECT DATEADD(DAY, -3, '2023-01-01') AS NovaData`

Lembre-se de que o DATEADD() não modifica a data original, ele retorna um novo valor de data com base na adição ou subtração do intervalo especificado.

**DATEDIFF()**

No SQL Server a função é usada para calcular a diferença entre duas datas em termos de um intervalo específico, como dias, meses, anos, etc. A sintaxe básica da função é a seguinte:

`DATEDIFF(intervalo, data_inicial, data_final)`

Onde:

- intervalo: é o intervalo que você deseja calcular, pode ser day para dia, month para mês, year para ano etc.

- data_inicial: data inicial que será usada no cálculo

- data_final: data final que será usada no cálculo

Vamos agora para alguns exemplos práticos.

Diferença entre duas datas em dias

`SELECT DATEDIFF(DAY, '2023-01-01', '2023-01-10') AS DiferencaDias`

Diferença entre dois meses

`SELECT DATEDIFF(MONTH, '2023-05-01', '2023-10-01') AS DiferencaMeses`

Diferença entre dois anos

`SELECT DATEDIFF(YEAR, '2020-01-01', '2023-01-01') AS DiferencaAnos`


É importante notar que a unidade de medida para a diferença pode variar dependendo do intervalo escolhido. Por exemplo, se você calcular a diferença em meses, o resultado será o número de meses completos entre as duas datas. Se você calcular em anos, o resultado será o número de anos completos entre as duas datas.

Lembre-se de que o DATEDIFF() não modifica a data original, ele retorna um novo valor de data com base na adição ou subtração do intervalo especificado.

**DATENAME()**

No SQL Server, a função DATENAME() é utilizada para retornar uma parte específica de uma data, como o nome do mês, o nome do dia da semana, etc. Essa função sempre retorna uma string. A sintaxe básica da função é a seguinte:

`DATENAME(datepart, data)`

Onde:

- datepart: é a parte da data que você deseja que retorne. Pode ser uma das seguintes opções:
     1. Ano: year, yy, yyyy
     2. Trimestre: quarter, qq, q
     3. Mês: month, mm, m
     4. Dia do ano: dayofyear, dy, y
     5. Dia: day, dd, d 
     6. Semana: week, wk, ww
     7. Dia da semana: weekday, dw
     8. Hora: hour, hh 
     9. Minuto: minute, mi, n
     10. Segundo: second, ss, s
     11. Milissegundo: millisecond, ms
     12. Microssegundo: microsecond, mcs
     13. Nanossegundo: nanosecond, ns

- data: é a data da qual você deseja extrair a parte específica.

Alguns exemplos práticos para melhor entendimento.

Pegar o nome do mês

`SELECT DATENAME(MONTH, '2023-01-01') AS NomeDoMes;`

Esse comando retornará: January

Pegar qual o dia da semana de uma data

`SELECT DATENAME(WEEKDAY, '2023-01-01') AS NomeDoDiaDaSemana;`

Esse comando retornará: Sunday

**DATEPART()**

A função DATEPART() no SQL Server é usada para extrair uma parte específica de uma data, como o ano, mês, dia, hora, minuto, etc. Essa função sempre retorna um inteiro. A sintaxe básica da função é a seguinte:

`DATEPART(datepart, data)`

- datepart: é a parte da data que você deseja extrair. Pode ser uma das seguintes opções:
     1. Ano: year, yy, yyyy
     2. Trimestre: quarter, qq, q
     3. Mês: month, mm, m
     4. Dia do ano: dayofyear, dy, y
     5. Dia: day, dd, d 
     6. Semana: week, wk, ww
     7. Dia da semana: weekday, dw
     8. Hora: hour, hh 
     9. Minuto: minute, mi, n
     10. Segundo: second, ss, s
     11. Milissegundo: millisecond, ms
     12. Microssegundo: microsecond, mcs
     13. Nanossegundo: nanosecond, ns

- data: é a data da qual você deseja extrair a parte específica

A seguir veremos um exemplo prático de como a função DATEPART() funciona.

Pegar qual o dia da semana de uma data

`SELECT DATENAME(WEEKDAY, '2023-01-01') AS NumeroDoDiaDaSemana;`

Nesse caso o retorno será: 7

Pegar qual o trimeste de uma data

`SELECT DATENAME(QUARTER, '2023-01-01') AS NumeroDoTrimestre;`

Já nesse caso, o retorno será: 1

**DAY(), MONTH() & YEAR()**

No SQL Server, as funções DAY(), MONTH(), e YEAR() são utilizadas para extrair partes específicas de uma data. Cada uma dessas funções retorna um valor numérico correspondente à parte específica da data.

Um exemplo prático do uso da função DAY()

`SELECT DAY('2023-01-01')` 

O retorno será: 1

Já o exemplo prático do uso da função MONTH()

`SELECT MONTH('2023-02-01')`

O retorno será: 2

Já o exemplo para a função YEAR()

`SELECT YEAR('2023-01-01')`

O retorno será: 2023

Essas funções são úteis quando você precisa extrair informações específicas de uma coluna de data ou de um valor de data específico. Por exemplo, ao lidar com relatórios que precisam agrupar dados por mês ou ano, você pode usar essas funções para extrair essas informações da data.

**GETDATE()**

A função GETDATE() no SQL Server é utilizada para obter a data e hora atuais do sistema do banco de dados; do servidor. Essa função não requer argumentos e retorna um valor do tipo datetime, representando a data e hora correntes no formato 'YYYY-MM-DD hh:mm:ss.sss'.

A sintaxe dessa função

`SELECT GETDATE() AS DataAtual`

**GETUTCDATE()**

A função GETUTCDATE() no SQL Server é semelhante à função GETDATE(), mas retorna a data e hora atuais no formato UTC (Tempo Universal Coordenado). O UTC é um padrão de tempo global que não sofre variação devido a fatores como horário de verão ou fusos horários regionais. O uso do UTC é comum em sistemas distribuídos ou ao lidar com operações que exigem consistência global no tempo.

A sintaxe dessa função

`SELECT GETUTCDATE() AS DataAtualUTC`

Ao contrário da GETDATE(), que retorna a data e hora locais do servidor SQL, GETUTCDATE() fornece a data e hora em relação ao padrão UTC. Isso pode ser especialmente útil em sistemas distribuídos ou em ambientes onde é crucial ter um ponto de referência de tempo consistente e global.


**SYSDATETIME()**

A função SYSDATETIME() no SQL Server é usada para obter a data e hora atuais do sistema, incluindo informações de frações de segundo. Ela retorna um valor do tipo datetime2, que é uma extensão do tipo datetime com uma precisão maior, incluindo frações de segundo

A sintaxe para essa função

`SELECT SYSDATETIME() AS DataHoraAtual`

A principal diferença entre SYSDATETIME() e GETDATE() é a precisão. SYSDATETIME() fornece uma representação mais precisa do tempo, incluindo frações de segundo, o que pode ser útil em situações que exigem uma resolução temporal mais fina.

Lembre-se de que, ao escolher entre SYSDATETIME() e GETDATE(), você deve considerar a necessidade de precisão temporal para o seu caso específico. Em muitos cenários, a precisão fornecida por SYSDATETIME() pode ser desnecessária, e GETDATE() pode ser suficiente.

**ISDATE()**

A função ISDATE() é utilizada para verificar se uma expressão pode ser convertida para um tipo de dados de data e hora. Ela retorna 1 se a expressão puder ser convertida com sucesso para uma data, e 0 se não puder. Se a expressão for nula ou não puder ser convertida para uma data, a função também retornará 0.

Sendo sua sintaxe básica

`ISDATE(expressão)`

expressão: é o que você deseja verificar se pode ser convertida para um tipo de dados de data e hora.

Agora vamos aos exemplos práticos

`SELECT ISDATE('2023-01-15') AS Resultado;`

O resultado será: 1

`SELECT ISDATE('2023-02-30') AS Resultado;`

Nesse caso o resultado será: 0

Em resumo, a compreensão dessas funções oferece aos desenvolvedores e analistas de dados uma base sólida para manipular efetivamente informações temporais no SQL Server. A aplicação adequada dessas funções contribui para a robustez, precisão e eficiência no tratamento de dados relacionados a datas em ambientes de banco de dados SQL Server. 

Ao incorporar essas técnicas em projetos, os profissionais podem melhorar significativamente a qualidade e a utilidade de suas soluções, proporcionando uma experiência mais rica e informada aos usuários finais.