Ferramentas para desenvolvedores · Conversor de carimbo de data/hora Unix
Números inteiros de época versus colunas de carimbo de data/hora: por que a unidade pertence ao esquema
· Por que é importante
carimbos de data/hora bancos de dados formatos de dados
Armazenar o tempo como uma época inteira é simples e portátil, mas somente se todos concordarem com a unidade e a zona. Esta postagem compara números inteiros com tipos de carimbo de data/hora nativos e argumenta que, seja qual for sua escolha, a unidade deve ser anotada.
criado_em: 1700000000 ou 1700000000000? — a coluna que dois serviços escreveram em unidades diferentes durante seis meses
Uma coluna chamada `created_at` contendo 1,738,578,000 e 1,738,578,000,000 não pode ser interpretada de forma consistente. A classificação separa numericamente os escritores por escala, e não por cronologia, e a detecção automática em cada leitor esconde a corrupção em vez de repará-la. O esquema não conseguiu preservar uma unidade necessária.
Antes da migração, crie o perfil dos valores por produtor e compare as linhas representativas com evidências de eventos independentes. Não divida cegamente todos os valores longos; uma coluna mista precisa de proveniência ou classificação cuidadosamente delimitada. ToolAcre ajuda a inspecionar amostras, mas não infere qual serviço gravou cada linha.
Magnitudes mistas também podem distorcer índices e consultas de retenção antes que alguém abra uma linha. Trate a descoberta como um incidente de integridade de dados, não apenas como um defeito de formatação em um cliente.
O caso das épocas inteiras — portabilidade, classificação, aritmética e independência das configurações de fuso horário do banco de dados
Uma época inteira é compacta para troca e fácil de comparar quando origem, unidade e largura são fixas. Ele evita texto formatado no local no armazenamento e oferece suporte à aritmética de duração após a normalização. Esses benefícios vêm de um contrato em torno do número, e não de INTEGER por si só.
Os custos aparecem quando esse contrato está ausente: os humanos não podem ler o valor diretamente, um cliente genérico pode arredondar números inteiros grandes e um tipo de coluna não diz nada sobre segundos versus milissegundos. Adicione um sufixo de unidade ou uma descrição de esquema e valide os gravadores no limite.
Um contrato inteiro também deve indicar arredondamento para entrada abaixo de um segundo. Piso, truncamento ou arredondamento podem atribuir eventos de limite a segundos diferentes, mesmo quando a escala estiver correta.
Épocas inteiras oferecem intercâmbio numérico simples, com compensações determinadas pelo esquema circundante
Um tipo temporal nativo de banco de dados pode expor operações de data legíveis e rejeitar algumas entradas inválidas, mas o intervalo, a semântica de fuso horário e a renderização do cliente variam de acordo com o mecanismo e o tipo. O repositório de carimbo de data/hora não contém adaptador de banco de dados, portanto não pode classificar esses produtos ou garantir “reconhecimento” de um nome de tipo genérico.
Leia a documentação atual do motor escolhido e teste o driver. Alguns clientes podem retornar strings, objetos Date ou valores ajustados por zona. Um tipo nativo reduz certas ambigüidades somente quando o tipo exato e o comportamento da sessão são compreendidos; não é um substituto universal para um modelo de tempo de aplicação.
O comportamento do carimbo de data/hora nativo é específico do banco de dados e deve ser verificado nesse mecanismo
Um inteiro com sinal estreito e um inteiro largo têm intervalos diferentes, mas a largura ainda não codifica a escala. Um BIGINT pode conter com segurança muitos milissegundos enquanto permanece semanticamente sem nome. Por outro lado, um campo de 32 segundos de bits se aproxima de um limite conhecido, embora seus valores pareçam comuns hoje.
Os comentários reivindicados na pasta de trabalho são o único registro, o que é muito absoluto. Nomes, tipos de domínio, restrições, esquemas gerados e especificações API podem carregar a unidade. Use mais de uma camada aplicável. Os comentários humanos ajudam os revisores, enquanto o código e a validação evitam que o redator mude silenciosamente de escala.
A largura e a unidade do campo são decisões de esquema independentes
Suponha que uma linha criada durante uma implantação 2025 conhecida contenha `1738578060000`. Em milissegundos torna-se `2025-02-03T10:21:00.000Z`; em segundos, está fora das expectativas normais e pode exceder a faixa do consumidor. Uma linha vizinha `1738578060` é mapeada para o mesmo instante que segundos.
Esse par sugere unidades mistas, mas não prova quais escritores são responsáveis. Agrupe por versão de serviço, caminho de ingestão ou magnitude e verifique vários eventos conhecidos. Preservar backups e logs de migração. O conversor é uma lente de auditoria, não um mecanismo de reescrita em massa.
Audite várias datas ao longo do período afetado. Uma correspondência coincidente pode ser enganosa, enquanto um padrão consistente específico do produtor apoia uma regra de migração controlada.
Exemplo resolvido: determine a escala de uma coluna herdada suspeita a partir de registros conhecidos
Evite a recorrência nomeando os campos brutos `created_at_s` ou `created_at_ms`, analisando em um adaptador e expondo um único tipo instantâneo interno. Armazene UTC instantes; aplique apresentação local apenas nas bordas voltadas para o usuário. Se um valor textual API for preferível, exija um deslocamento explícito ou Z.
Os testes devem enviar valores distinguíveis através de cada limite de serialização. Zero é um acessório ruim porque ambas as escalas concordam. Afirme um instante ISO fixo e faça uma viagem de ida e volta através do driver real. Isso detecta a perda de unidades antes que dois serviços preencham uma coluna de maneira diferente durante meses.
Durante a migração, rejeite novas gravações que violem o contrato escolhido antes de reparar linhas antigas. Caso contrário, a limpeza gera uma fonte ativa que continua criando dados mistos.
O que isso não cobre — funções específicas do banco de dados, como FROM_UNIXTIME e to_timestamp, que variam de acordo com o mecanismo
Este artigo não prescreve `FROM_UNIXTIME`, `to_timestamp` ou funções equivalentes. Suas unidades de entrada, intervalos e interações de zona pertencem a mecanismos e versões específicos, nenhum dos quais faz parte da implementação ToolAcre. Copiar o nome de uma função entre bancos de dados pode criar a própria ambiguidade em análise.
Use a documentação do fornecedor e uma tabela descartável para comprovar as conversões antes de uma migração. Evite que as transformações do aplicativo e do banco de dados apliquem o mesmo deslocamento ou fator. Uma única conversão bem controlada é mais fácil de testar do que uma cadeia de conversões implícitas.
Execute a função de banco de dados em acessórios de limite nas mesmas configurações de sessão da produção. Os padrões da zona de sessão podem alterar os resultados textuais mesmo quando a aritmética da época está correta.
Conclusão: o esquema é onde a unidade reside - e como o conversor de carimbo de data / hora Unix ajuda a auditar os dados existentes, informando a unidade aplicada
O esquema deve fazer com que a representação do carimbo de data/hora não seja surpreendente para todos os escritores e leitores. Os números inteiros podem ser apropriados; colunas temporais nativas podem ser apropriadas. Uma escala sem nome não é. Escolha um contrato, aplique-o e trate a conversão como uma operação de limite explícita.
Para dados legados, inspecione amostras em ambas as unidades, correlacione-as com eventos conhecidos e registre a incerteza. A seleção da unidade visível de ToolAcre apoia essa investigação, mas a decisão final de migração deve vir da proveniência e da semântica real do banco de dados.
Uma revisão de esquema só é concluída quando escritores, leitores, índices e trabalhos de retenção compartilham o mesmo modelo. A correção do comentário da coluna por si só deixa intacta a ambigüidade do executável.