Extensão de data/hora de alta precisão
O SQLite oferece funções básicas de data, mas, como havia necessidade de mais recursos, foi criada uma extensão de data/hora de alta precisão chamada sqlean-time. Essa extensão oferece uma API estruturada e vários recursos.
Observação. Adicionar extensões ao SQLite é muito simples. Basta baixar o arquivo e executar um único comando no banco de dados.
Conceitos
Essa extensão usa dois tipos de valor: tempo (Time) e duração (Duration).
-
Tempo (Time): um par composto por segundos e nanossegundos, que representa os segundos desde o tempo zero (0001-01-01 00:00:00 UTC) e os nanossegundos dentro do segundo atual.
- É possível armazenar o tempo usando uma representação interna, o que permite representar datas de bilhões de anos no passado ou no futuro com precisão de nanossegundos.
- Também é possível armazenar o tempo como segundos desde a Unix epoch (1970-01-01 00:00:00 UTC), incluindo milissegundos, microssegundos e nanossegundos.
- O tempo é sempre armazenado e operado em UTC, mas pode ser convertido para um deslocamento de fuso horário específico.
-
Duração (Duration): um número de 64 bits em nanossegundos, capaz de representar valores de até cerca de 290 anos.
Criando valores de tempo
-
Hora atual:
select time_fmt_iso(time_now()); -- 2024-08-06T21:22:15.431295000Z -
Data/hora específica:
select time_fmt_iso(time_date(2011, 11, 18)); -- 2011-11-18T00:00:00Z select time_fmt_iso(time_date(2011, 11, 18, 15, 56, 35)); -- 2011-11-18T15:56:35Z
Extraindo campos de tempo
Há funções para extrair vários campos de data/hora:
select 'year = ' || time_get_year(time_now());
select 'month = ' || time_get_month(time_now());
select 'day = ' || time_get_day(time_now());
Tempo Unix
Funções para criar valores de tempo a partir do tempo Unix (tempo desde 1970-01-01 UTC):
select time_fmt_iso(time_unix(1321631795)); -- 2011-11-18T15:56:35Z
Funções para converter valores de tempo em tempo Unix:
select time_to_unix(time_now()); -- 1722979335
Comparação de tempo
Funções para comparar valores de tempo:
select time_after(time_now(), time_date(2011, 11, 18)); -- 1
select time_before(time_now(), time_date(2011, 11, 18)); -- 0
Operações com tempo
Funções para adicionar durações a valores de tempo:
select time_fmt_iso(time_add(time_now(), 24*dur_h())); -- 2024-08-07T21:22:15.431295000Z
Constantes de duração:
dur_us()- 1 microssegundodur_ms()- 1 milissegundodur_s()- 1 segundodur_m()- 1 minutodur_h()- 1 hora
Arredondamento
Funções para arredondar valores de tempo para a precisão do campo especificado:
select 'original = ' || time_fmt_iso(t.v) from t union all
select 'millennium = ' || time_fmt_iso(time_trunc(t.v, 'millennium')) from t;
Formatação
Funções que retornam strings de tempo em ISO 8601:
select time_fmt_iso(time_date(2011, 11, 18, 15, 56, 35, 666777888), 3*3600); -- 2011-11-18T18:56:35.666777888+03:00
Constantes de duração
Funções que retornam durações comuns em nanossegundos:
select dur_ns(); -- 1
select dur_us(); -- 1000
Agradecimentos
Essa extensão foi implementada em C e projetada e implementada com base no pacote time da biblioteca padrão do Go (licença BSD 3-Clause).
Instalação e uso
- Baixe a versão mais recente
- Use na interface de linha de comando do SQLite:
sqlite> .load ./time sqlite> select time_now();
Resumo do GN⁺
- A extensão
sqlean-timeadiciona recursos de data/hora de alta precisão ao SQLite, possibilitando várias operações com tempo. - Como é possível lidar com tempo e duração em nanossegundos, dá para fazer cálculos de tempo extremamente precisos.
- Ela oferece vários recursos de formatação e comparação de tempo, facilitando o uso pelos desenvolvedores.
- Fornece muito mais recursos do que as funções de data padrão do SQLite, sendo útil para projetos que exigem operações temporais complexas.
1 comentários
Comentários do Hacker News
Pergunta se isso lida com casos especiais de mudanças de fuso horário e descontinuidades no horário local documentados por Jon Skeet
É melhor não criar bibliotecas de data/hora e criptografia por conta própria
As três diferentes representações/escopos de tempo são interessantes
É importante esclarecer se são usados inteiros com sinal
Seria bom se o SQLite3 tivesse um sistema de tipos extensível
É avaliado como algo muito legal, ao mencionar um recurso importante que falta no SQLite
Argumenta que o banco de dados deveria rastrear unidades
float64Pergunta qual é mais útil: a representação em nanossegundos ou anos fora do alcance nano
Sugere usar timestamps Unix no estilo do golang em nanossegundos, como
int64com sinalArgumenta que não se deve usar a expressão "segundos desde a epoch" a menos que ela signifique exatamente isso
select time_sub(time_date(2011, 11, 19), time_date(1311, 11, 18));