Database
 sql >> Base de Dados >  >> RDS >> Database

Usando as funções DATEADD, DATEDIFF e DATEPART T-SQL em termos simples


Este artigo se concentra no desenvolvimento de uma compreensão básica de como usar uma das funções de data Transact-SQL mais comuns:DATEADD, DATEDIFF e DATEPART.

Neste artigo, também enfatizei a importância do uso adequado dessas funções de data em manipulações de datas diárias seguidas de alguns cenários interessantes em que essas funções de data podem ser usadas de forma colaborativa para resolver cálculos de data ligeiramente complexos.

Como essas funções são usadas principalmente em manipulações de datas, vamos primeiro tentar entender o que queremos dizer com manipulação de datas.


Compreendendo a manipulação de data


Os valores de data e hora geralmente precisam ser modificados conforme o requisito, e o método de modificação, manipulação ou controle dos cálculos de data e hora é conhecido como manipulação de data.

Também nos referimos a essa situação (manipulação de data) quando um valor de data é lido de um banco de dados e depois modificado antes de ser armazenado novamente.

Cenário de pedido do cliente


Um exemplo interessante de manipulação de data é um pedido do cliente cenário, quando um pedido colocado por um cliente for processado, a data de entrega deve ser definido 5 dias antes da data do pedido , então isso significa que um desenvolvedor deve usar a(s) função(ões) de data T-SQL para manipular (modificar) a data do pedido para calcular a data de entrega .

Exemplo de relatório diário de vendas


Um exemplo um pouco complexo é quando um usuário empresarial executa um Relatório de vendas diário se mostrar os resultados de ontem.

Por exemplo, se executarmos o Relatório de vendas diário no domingo às 11:00, ele nos mostrará os resultados com base no sábado, e se executarmos no sábado às 17:00, ele nos mostrará todos os resultados na sexta-feira, porque o dia atual ainda não acabou e o mais recente dia completo disponível é ontem. É assim que a maioria dos relatórios diários profissionais, incluindo relatórios financeiros, são projetados para serem executados.

Neste exemplo, a data atual é manipulado (modificado) para obter a data anterior, que contém registros de vendas de um dia completo.


Implementação dos exemplos


Lembre-se dos exemplos acima, pois implementaremos esses cenários assim que tivermos uma boa compreensão do uso de algumas das funções de data mais comuns descritas neste artigo.

Compreendendo as funções de data


Vejamos primeiro algumas funções básicas de data que podem nos ajudar a atender aos requisitos de manipulação de datas, como determinar os dias entre duas datas (data do pedido e data de entrega), obter os registros de vendas da semana anterior com base na data atual ou calcular a data de vencimento esperada com base no data de produção e assim por diante.

Como não há regras rígidas e rápidas, começamos a explorar a função DATEPART primeiro.

Usando a função DATEPART

Definição simples


A função DATEPART é usada para retornar uma parte de uma determinada data em um valor numérico.

A parte pode ser o dia da data, mês da data, ano da data etc.

Por exemplo, podemos usar a função DATEPART para obter o dia de uma determinada data para determinar se um pedido foi feito no domingo ou não.

Outro exemplo é fazer com que o mês de uma determinada data seja passado para outra função de data para processamento adicional.

Definição da Microsoft


Esta função retorna um inteiro representando a datepart especificada da data especificada .

Compatibilidade


De acordo com a documentação da Microsoft, esta função é compatível com as seguintes versões do SQL Server:
  1. SQL Server 2008 mais
  2. Banco de dados SQL do Azure
  3. Azure SQL Data Warehouse
  4. Armazém de dados paralelo

Sintaxe

DATEPART (datepart , data)

Exemplo 1:obtendo parte do ano da data


Vamos também definir uma determinada data (OrderDate ) para obter a parte desejada (Dia, Mês, Ano) usando a função DATEPART.

Para obter o Ano da data do pedido, simplesmente passamos ANO seguido por Data do pedido (@OrderDate) no DATEPART funcionar da seguinte forma:
-- Definir a data do pedidoDECLARE @OrderDate DATETIME2='2017-01-11'-- Obtendo o ano da data do pedidoSELECT DATEPART(YEAR,@OrderDate) como Year_OrderDate


Exemplo 2:Como obter a parte do mês


Se estivermos interessados ​​em saber o mês da data, então Mês precisa ser passado para o DATEPART funcionar da seguinte forma:
-- Definir a data do pedidoDECLARE @OrderDate DATETIME2='2017-01-11'-- Obtendo o mês da data do pedidoSELECT DATEPART(MONTH,@OrderDate) como Month_OrderDate


Exemplo 3:Parte do dia de recebimento


Para encontrar a parte do dia da data, basta passar DAY no DATEPART funcionar da seguinte forma:
-- Definir a data do pedidoDECLARE @OrderDate DATETIME2='2017-01-11'-- Obtendo o dia do pedido DateSELECT DATEPART(DAY,@OrderDate) como Day_OrderDate


Exemplo 4:Como obter a parte do dia da semana


Para obter a parte do dia da semana da data, basta passar WEEKDAY no DATEPART funcionar da seguinte forma:
-- Definir a data do pedidoDECLARE @OrderDate DATETIME2='2017-01-11'-- Obtendo o dia da semana da data do pedidoSELECT DATEPART(WEEKDAY,@OrderDate) como WeekDay_OrderDate

Estamos recebendo 4, que é quarta-feira a partir de domingo, que é 1.

Da mesma forma, também podemos obter um quarto, hora, minuto, segunda parte da data.

Vamos passar para a próxima função de data.

Usando a função DATEADD

Definição simples


A função DATEADD é usada para adicionar ou subtrair uma data.

Por exemplo, podemos descobrir qual será a data após quatro dias ou quatro dias antes.

Isso é muito útil nos cenários em que a data esperada deve ser calculada com base em uma determinada data, como a data de expiração da associação deve ser exatamente um ano a partir da data de registro.

Outro exemplo é calcular a data de término do curso que deve ser exatamente dois meses após a data de início do curso.

Definição da Microsoft


Esta função adiciona um número especificado valor (como um inteiro assinado) para um datepart especificado de uma entrada data valor e, em seguida, retorna esse valor modificado.

Compatibilidade


De acordo com a documentação da Microsoft, esta função é compatível com as seguintes versões do SQL Server:
  1. SQL Server 2008 mais
  2. Banco de dados SQL do Azure
  3. Azure SQL Data Warehouse
  4. Armazém de dados paralelo

Sintaxe

DATEADD (parte de data, número, data)

Datepart é qualquer parte da data, como dia, mês, ano, dia da semana, hora etc.

Number é então o número da parte da data (dia, mês, ano etc.)

Data é uma determinada data que precisa ser adicionada ou subtraída usando a função DATEADD

Exemplo 1:Obtendo a data do próximo ano


Vamos também definir uma determinada data (Data de Registro) que será adicionada ou subtraída usando o DATEADD função com base nos requisitos.

A data do próximo ano pode ser obtida adicionando 1 à parte da data do ano.

Para obter o próximo ano a partir da data de registro, basta adicionar DatePart Year seguido por 1 seguido por Data de registro (@RegistrationDate) no DATEADD funcionar da seguinte forma:
-- Definir data de registroDECLARE @RegDate DATETIME2='2018-07-10'-- Obtendo o próximo ano a partir da data de registroSELECT DATEADD(YEAR,1,@RegDate) como NextYear_RegDate


Exemplo 2:obtendo a data do próximo mês


Para obter a data do próximo mês, passe o MÊS datepart para o DATEADD função seguida pelo número de meses que queremos adicionar seguido pela data fornecida, que é a data de registro (RegDate) no nosso caso.
-- Definir data de registroDECLARE @RegDate DATETIME2='2018-07-10'SELECT @RegDate AS RegDate -- Mostrar data de registro-- Obtendo o próximo mês a partir da data de registroSELECT DATEADD(MONTH,1,@RegDate) como NextMonth_RegDate 

Exemplo 3:obtendo a data do dia seguinte


Se o curso começar no dia seguinte (próximo) de inscrição, precisamos passar DAY com 1 uma vez que o dia seguinte acrescenta mais um dia à data de registo, o que se demonstra da seguinte forma:
-- Definir data de registroDECLARE @RegDate DATETIME2='2018-07-10'SELECT @RegDate AS RegDate -- Mostrar data de registro-- Obtendo o próximo dia da data de registroSELECT DATEADD(DAY,1,@RegDate) como NextDAY_RegDate 

Exemplo 4:configuração da data do relatório diário de vendas


Agora vamos nos concentrar em um cenário um pouco complexo frequentemente usado no desenvolvimento de relatórios financeiros diários.

Se quisermos criar um relatório diário de vendas, ele deve mostrar os dados de ontem, pois o dia atual ainda não está completo e o dia completo mais recente é ontem, conforme discutido no início deste artigo.

No final, também precisamos converter o valor Date Time de ontem em Date only para tornar mais fácil para o relatório cobrir o dia inteiro.

Para obter a data de ontem com base na data de hoje, precisamos adicionar “-1 dia” à data atual da seguinte forma:
-- Definir a data atualDECLARE @CurrentDate DATETIME2=GETDATE()SELECT @CurrentDate AS CurrentDate -- Mostrar data de registro-- Obtendo a data e hora de ontem da data atualSELECT DATEADD(DAY,-1,@CurrentDate) como YesterdayDateTime_CurrentDate-- Convertendo Ontem DateTime into Date onlySELECT CAST(DATEADD(DAY,-1,@CurrentDate) AS DATE)as YesterdayDateOnly_CurrentDate


Usando a função DATEDIFF

Definição simples


A função DATEDIFF é usada para determinar a diferença em dias, meses, anos, horas etc. entre duas datas.

Por exemplo, podemos descobrir quantos dias se passaram entre duas datas.

Isso também é muito útil nos cenários em que precisamos investigar a diferença entre a data de entrega esperada do pedido e a data de entrega real do pedido.

Outro exemplo é o rastreamento de tempo, o que significa entender quantas horas foram gastas em um determinado projeto desde o início até agora.

Definição da Microsoft


Esta função retorna a contagem (como um valor inteiro com sinal) dos limites especificados da parte de data cruzados entre a data de início especificada e data de término .

Compatibilidade


De acordo com a documentação da Microsoft, esta função é compatível com as seguintes versões do SQL Server:
  1. SQL Server 2008 mais
  2. Banco de dados SQL do Azure
  3. Azure SQL Data Warehouse
  4. Armazém de dados paralelo

Sintaxe

DATADIFF( datepart , startdate , enddate )

Datepart é qualquer parte da data, como dia, mês, ano, dia da semana, hora etc.

Exemplo 1:Entendendo a diferença em dias


Vamos tentar entender como o DATEDIFF função funciona.

Se tentarmos descobrir a diferença de dias entre 01 de julho de 2018 e 02 de julho de 2018, obteremos 1 dia, o que significa que subtrai a data de término da data de início para obter a diferença:
SELECT DATEDIFF(DAY,'01 JULHO 2018','02 JULHO 2018') AS Days_Between_Two_Consecutive_DatesSELECT DATEDIFF(DAY,'01 JULHO 2018','03 JULHO 2018') AS Days_Between_01_July_03_July


Exemplo 2:dias entre o pedido e a entrega


Vamos definir duas datas diferentes, Data do pedido e Data de entrega, que será usado para determinar a diferença em dias, meses, anos, horas etc.

Para descobrir o número de dias entre a data do pedido e a data de entrega, o DAY datepart é passado para o DATEDIFF função seguida por Data de início (Data do pedido) e Data de término (Data de entrega) :
-- Definir a data do pedido e a data de entrega do pedidoDECLARE @OrderDate DATETIME2='28 de julho de 2018'DECLARE @DeliveryDate DATETIME2='07 de agosto de 2018'SELECT @OrderDate AS OrderDate,@DeliveryDate as DeliveryDate-- Mostrar datas de pedido e entrega-- Obtendo a diferença em dias entre a data do pedido e a data de entregaSELECT DATEDIFF(DAY,@OrderDate,@DeliveryDate) as Days_Between_Order_and_Delivery


Exemplo 3:obtenção de horas do projeto (rastreamento de tempo)


Este é um exemplo interessante de rastreamento de tempo usando a função DATEDIFF.

Por exemplo, estamos interessados ​​em saber quantos dias totais e dias em horas e dias em minutos gastamos em um projeto específico, e então vamos primeiro passar a parte da data DAY para a função DATEDIFF, onde a data de início é a data em que o projeto começou e a data de término é a data de hoje, seguida de HOUR e, em seguida, de MINUTE da seguinte forma:
-- Definir a data de início do projetoDECLARE @ProjectStartDate DATETIME2='10 Nov 2018'SELECT @ProjectStartDate AS ProjectStartDate-- Mostrar data de início do projeto-- Obtendo o número de dias gastos no projeto até agoraSELECT DATEDIFF(DAY,@ProjectStartDate,GETDATE( )) as Project_Days_So_Far-- Obtendo o número de horas gastas no projeto até agoraSELECT DATEDIFF(HOUR,@ProjectStartDate,GETDATE()) as Project_Hours_So_Far-- Obtendo o número de minutos gastos no projeto até agoraSELECT DATEDIFF(MINUTE,@ProjectStartDate,GETDATE( )) como Project_Minutes_So_Far



Parabéns, você aprendeu com sucesso a usar as funções DATEADD, DATEDIFF e DATEPART T-SQL.

Coisas para fazer


Agora que você está familiarizado com algumas funções básicas de data, desafie-se tentando as coisas mencionadas abaixo:
  1. Consulte meu artigo anterior Procedimentos de relatório de teste de unidade – Ir para o início TDDD Parte 4 para configurar um banco de dados SQLDevBlogReportTDD de exemplo e, em seguida, crie uma visualização para descobrir o número de meses com base na data de registro do autor.
  2. l>
  3. Consulte meu artigo anterior Simplificando o procedimento armazenado principal do teste de unidade que também chama um procedimento de utilitário para criar um banco de dados SQLBookShop de exemplo e adicionar a DeliveryDate coluna para o BookOrder tabela e, em seguida, crie um novo procedimento armazenado ProcessOrder que usa o DATEADD função para adicionar a entrega prevista cinco dias após a data do pedido.
  4. Por favor, dê uma olhada no meu artigo anterior Jump to Start Test-Driven Database Development (TDDD) – Parte 3 e tente criar um relatório diário usando a função DATEADD T-SQL modificando os dados no banco de dados SQLDevBlogReportTDD de exemplo para que há dados suficientes para serem exibidos no relatório.