Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Mão na massa: usando Data Unix para operações em datas

Fiz um pouco diferente do professor, mas acredito que com a mesma lógica. Para ficar mais didático para eu aprender criei colunas com os passos.

with datas as(
  select distinct data, data_unix, timestamp_seconds(data_unix) as data_unix_timestamp from `belleza_verde_vendas.vendas`
)
select data, 
       date_add(date_trunc(date_add(data, interval 1 month), month), interval 15 day) as dt_vencimento,
       data_unix as dt_unix_original,
       data_unix_timestamp,
       timestamp_add(timestamp_trunc(timestamp_add(data_unix_timestamp, interval 2678400 second), month), interval 15 day) as dt_unix_ts_15,
       unix_seconds(timestamp_add(timestamp_trunc(timestamp_add(data_unix_timestamp, interval 2678400 second), month), interval 15 day)) as data_unix_vencimento
from datas;

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá, Vinicius. Como vai?

Parabéns pelo excelente projeto! A sua abordagem ficou sensacional e demonstra uma maturidade técnica muito alta. Criar colunas intermediárias para quebrar um problema complexo em etapas menores é, inclusive, uma das melhores práticas recomendadas em engenharia de dados. Isso ajuda não apenas no seu processo de aprendizado, mas também facilita imensamente a manutenção e a leitura do código por outros desenvolvedores.

Analisando a sua consulta no Google BigQuery, vale destacar alguns pontos em que você mandou muito bem:

  • Uso da CTE (WITH datas AS): Isolar a busca inicial com o DISTINCT e a conversão de segundos para timestamp em uma tabela temporária deixou a estrutura do seu código limpa e otimizada.
  • Manipulação matemática com segundos: No cálculo do Unix Timestamp, você usou o intervalo de 2678400 second (que equivale exatamente a 31 dias: 31 * 24 * 60 * 60). Essa lógica funcionou perfeitamente para empurrar a data para o mês seguinte antes de aplicar o truncamento com o timestamp_trunc.
  • Precisão nos resultados: Ao olhar a tabela de resultados da sua consulta, é possível notar que todas as linhas (independentemente do dia original de janeiro) foram calculadas com precisão cirúrgica para o dia 16 de fevereiro de 2021 (2021-02-16), batendo perfeitamente o valor do tipo DATE com o valor convertido em TIMESTAMP e unix_seconds.

Para agregar ainda mais valor ao seu estudo sobre funções de data e hora no BigQuery, deixo duas sugestões e boas práticas que podem simplificar scripts futuros:

1. Simplificação do intervalo Unix

Embora calcular o intervalo em segundos (2678400 second) mostre que você domina a matemática por trás do Unix Time, o BigQuery permite que você utilize a palavra-chave MONTH mesmo dentro da função timestamp_add. Isso poupa o trabalho de calcular os segundos manualmente na calculadora. Veja o exemplo:

-- Forma simplificada usando MONTH em vez de segundos
timestamp_add(data_unix_timestamp, interval 1 month)

2. Atenção ao truncamento de meses com durações diferentes

A sua lógica de adicionar 31 dias (2678400 second) funcionou perfeitamente para o mês de janeiro. Contudo, uma dica de ouro para o dia a dia com bancos de dados é tomar cuidado ao usar segundos fixos para representar "um mês".

Como os meses variam entre 28, 30 e 31 dias, adicionar um número fixo de segundos em outros meses do ano pode, ocasionalmente, saltar dois meses ou não chegar ao mês seguinte. Por essa razão, sempre que o objetivo for pular exatamente para o próximo mês, priorize o uso de interval 1 month direto nas funções nativas de data, pois o motor do BigQuery já calcula internamente a variação dos dias de cada mês de forma automática.

O seu projeto final ficou impecável e a exibição dos resultados prova que a sua lógica está totalmente correta. Continue explorando o poder das funções do BigQuery!

Espero que possa ter lhe ajudado!