Manipulando datas no #Sqlite. (#dev)

Manipulando datas no #Sqlite. (#dev)

Overview

Se você já se viu às voltas tentando ajustar datas em seus projetos de desenvolvimento, este guia é para você! Vamos explorar como a magia das datas funciona no SQLite, desde adicionar e subtrair dias, meses e anos, até truques mais sofisticados como configurar uma data para o início do mês ou posicionar uma data num dia da semana específico. Tudo explicado de forma clara e objetiva, para que possa voltar aqui sempre que precisar de uma mãozinha com suas datas. Vamos nessa?

Alguns exemplos de como adicionar ou subtrair dias a uma data, voltar uma data para o inicio do mês, mover uma data para um dia da semana específico, etc. São comandos simples, mas que podem ajudar muito na hora de desenvolver um aplicativo.

Recuperando data atual

UTC

select date('now');

Horário local

select date('now', 'localtime');

Recuperando data e hora atuais

UTC

select datetime('now');

Horário local

select datetime('now', 'localtime');

Modificando data e hora

Nos comandos abaixo, vou utilizar o valor “now” como data a ser alterada, mas você pode substituir este valor por uma data que deseja modificar.

Adicionando/Subtraindo segundos

select datetime('now', '+1 seconds');
select datetime('now', '-1 seconds');

Adicionando/Subtraindo horas

select datetime('now', '+1 seconds');
select datetime('now', '-1 seconds');

Adicionando/Subtraindo dias

select datetime('now', '+1 days');
select datetime('now', '-1 days');

Adicionando/Subtraindo meses

select datetime('now', '+1 months');
select datetime('now', '-1 months');

Adicionando/Subtraindo anos

select datetime('now', '+1 years');
select datetime('now', '-1 years');

Voltando ao inicio do dia (00:00:00)

select datetime('now', 'start of day');

Voltando ao inicio do mês (primeiro dia do mês as 00:00:00)

select datetime('now', 'start of month');

Voltando ao inicio do ano (1 de janeiro as 00:00:00)

select datetime('now', 'start of year');

Avançando a data para um dia da semana

select datetime('now', 'weekday 0'); -- Domingo
select datetime('now', 'weekday 1'); -- Segunda-feira
select datetime('now', 'weekday 2'); -- Terça-feira
select datetime('now', 'weekday 3'); -- Quarta-feira
select datetime('now', 'weekday 4'); -- Quinta-feira
select datetime('now', 'weekday 5'); -- Sexta-feira
select datetime('now', 'weekday 6'); -- Sábado

Esta função é bem útil. Você utiliza a sintaxe “weekday N”, onde N é igual ao número do dia da semana. Para o sqlite, os dias são:

  • Domingo: 0 (zero)
  • Segunda-feira: 1
  • Terça-feira: 2
  • Quarta-feira: 3
  • Quinta-feira: 4
  • Sexta-feira: 5
  • Sábado: 6

Um detalhe importante: Esta função vai avançar a data até o próximo dia da semana escolhido, mantendo o horário. Todavia, se hoje for quarta-feira e você escolher quarta-feira (4) como o “dia alvo”, a função vai retornar a própria data, ou seja, se hoje for quarta-feira e você quiser saber a data da próxima quarta, não vai funcionar desta forma. (mas tem uma solução mais pra baixo neste post.)

Manipulações múltiplas na mesma data

Dei muitos exemplos neste post, mas o legal é que as funções datetime, date e time aceitam vários modificadores (é o nome oficial disso que estamos usando) na mesma chamada. Exemplo:

datetime('now', 'modifier1', 'modifier2', 'modifier3', 'modifier4')

Então, se você quiser saber qual foi o dia da primeira quarta-feira de 2020, pode usar o comando baixo:

select datetime('2020-08-08T12:35:49', 'start of year', 'weekday 3');

Mas e se você quiser saber qual foi o dia da segunda quarta-feira de 2020? O ano começou em uma quarta, então precisamos de mais um ajuste…

select datetime('2020-08-08T12:35:49', 'start of year', '+1 days', 'weekday 3');

O que fiz ali foi adicionar 1 dia, o que me levou para o dia 2. A partir daí, procurei a próxima quarta-feira.

Este encadeamento funciona de modo sequencial, ou seja, a partir da data que está no primeiro argumento, o SQLite vai executando os outros modificadores na sequência.

Notas e bugs

Então, existem algumas observações sobre a manipulação de datas.

  1. O cálculo da hora local (por ser afetada por decisões políticas) não é uma ciência exata. Sendo assim, o calculo funciona bem entre os anos de 1970 e 2037. Para datas fora desse intervalo, o SQLite tenta mapear o ano em um ano equivalente dentro desse intervalo, faça o cálculo e mapeie o ano novamente.
  2. Essas funções funcionam apenas para datas entre 0000-01-01 00:00:00 e 9999-12-31 23:59:59 (dia do calendário juliano números 1721059.5 a 5373484.5). Para datas fora desse intervalo, os resultados dessas funções são indefinidos.
  3. As plataformas Windows não Vista suportam apenas um conjunto de regras de horário de verão. O Vista suporta apenas dois. Portanto, nessas plataformas, os cálculos históricos do horário de verão estarão incorretos. Por exemplo, nos EUA, em 2007, as regras do horário de verão foram alteradas. As plataformas Windows que não são o Vista também aplicam as novas regras de horário de verão de 2007 para todos os anos anteriores. O Vista faz um pouco melhor a obtenção de resultados corretos desde 1986, quando as regras também foram alteradas.
  4. Todos os cálculos internos assumem o sistema de calendário gregoriano. Supõe-se também que todos os dias tenham exatamente 86400 segundos de duração.

Espero ter ajudado! 🙂

Referências: https://www.sqlite.org/lang_datefunc.html