No Ruby on Rails, qual é a diferença entre DateTime, Timestamp, Time e Date?

414

Na minha experiência, acertar datas / horas quando a programação está sempre cheia de perigos e dificuldades.

Ruby e Rails sempre me iludiram neste caso, mesmo que apenas devido ao grande número de opções; Eu nunca tenho nenhuma idéia do que escolher.

Quando estou usando o Rails e olhando para os tipos de dados ActiveRecord, posso encontrar o seguinte

: datetime,: timestamp,: time e: date

e não tenho idéia de quais são as diferenças ou onde estão as dicas.

Qual é a diferença? Pra quê você usa eles?

(PS, estou usando o Rails3)

Nick May
fonte

Respostas:

572

A diferença entre os diferentes formatos de data / hora no ActiveRecord tem pouco a ver com o Rails e tudo a ver com o banco de dados que você estiver usando.

Usando o MySQL como um exemplo (se não por outra razão porque é mais popular), você tem DATE, DATETIME, TIMEe TIMESTAMPtipos de dados de coluna; assim como você tem CHAR, VARCHAR, FLOATe INTEGER.

Então, você pergunta, qual é a diferença? Bem, alguns deles são auto-explicativos. DATEarmazena apenas uma data, TIMEapenas armazena uma hora do dia, enquanto DATETIMEarmazena as duas.

A diferença entre DATETIMEe TIMESTAMPé um pouco mais sutil: DATETIMEestá formatado como YYYY-MM-DD HH:MM:SS. Os intervalos válidos vão do ano 1000 ao ano 9999 (e tudo mais. Embora TIMESTAMP pareça semelhante quando você o busca no banco de dados, é realmente apenas uma fachada para um registro de data e hora unix . Seu intervalo válido varia de 1970 a 2038. A diferença aqui, além de vários built-in funções dentro do motor de banco de dados, é espaço de armazenamento. Porque DATETIMElojas todos os dígitos no ano, mês dia, hora, minuto e segundo, ele usa-se um total de 8 bytes. Como TIMESTAMParmazena apenas o número de segundos desde 01-01-2009, ele usa 4 bytes.

Você pode ler mais sobre as diferenças entre os formatos de hora no MySQL aqui .

No final, tudo se resume ao que você precisa que sua coluna de data / hora faça. Você precisa armazenar datas e horários antes de 1970 ou após 2038? Use DATETIME. Você precisa se preocupar com o tamanho do banco de dados e está dentro desse intervalo de tempo? Use TIMESTAMP. Você só precisa armazenar uma data? Use DATE. Você só precisa armazenar um tempo? Use TIME.

Tendo dito tudo isso, o Rails realmente toma algumas dessas decisões para você . Ambos :timestampe :datetimepadronizarão para DATETIME, enquanto :datee :timecorresponde a DATEe TIME, respectivamente.

Isso significa que, no Rails, você só precisa decidir se precisa armazenar data, hora ou ambas.

vonconrad
fonte
7
Para o registro, prefiro carimbos de data / hora absolutos (unix) porque o formato AAAA-MM-DD depende do fuso horário usado. Portanto, o cliente precisa conhecer o fuso horário do servidor e fazer conversões. Os registros de data e hora absolutos desde 1970 não têm esse problema.
n13 5/04/12
32
@ n13 Bom ponto, mas não é realmente um problema no Rails, pois ele é convertido em UTC antes de inserir as datas no banco de dados.
vonconrad
13
Esta é uma das postagens mais úteis no universo Rails. Isto deve ser adicionado à guia trilhos ...
Andrew
4
A TIMEcoluna do MySQL não é estritamente uma "hora do dia", pois aceita horas> 24; também é utilizável como "tempo decorrido".
nickgrim
6
É o mesmo em outros dbs? por exemplo, postgres?
Andy Hayden
24
  1. : datetime (8 bytes)

    • Armazena a data e a hora formatadas AAAA-MM-DD HH: MM: SS
    • Útil para colunas como data de nascimento
  2. : registro de data e hora (4 bytes)

    • Armazena o número de segundos desde 01-01 1970
    • Útil para colunas como updated_at, created_at
  3. : data (3 bytes)
    • Data das lojas
  4. : time (3 bytes)
    • Tempo das lojas
mingca
fonte
3
Isto é mais parecido com a versão TL: DR da resposta aceita acima
Chidozie Nnachor
0

Aqui está uma explicação impressionante e precisa que eu encontrei.

TIMESTAMP usado para rastrear alterações de registros e atualizar sempre que o registro é alterado. DATETIME usado para armazenar valores estáticos e específicos que não são afetados por nenhuma alteração nos registros.

O TIMESTAMP também é afetado por diferentes configurações relacionadas ao Fuso Horário. DATETIME é constante.

O TIMESTAMP converteu internamente um fuso horário atual em UTC para armazenamento e, durante a recuperação, converte-o novamente no fuso horário atual. DATETIME não pode fazer isso.

TIMESTAMP é de 4 bytes e DATETIME é de 8 bytes.

Intervalo suportado TIMESTAMP: '1970-01-01 00:00:01' UTC para '2038-01-19 03:14:07' UTC DATETIME intervalo suportado: '1000-01-01 00:00:00' para '9999 -12-31 23:59:59 ′

fonte: https://www.dbrnd.com/2015/09/difference-between-datetime-and-timestamp-in-mysql/#:~:text=DATETIME%20vs%20TIMESTAMP%3A,DATETIME%20is%20constant .

Além disso...

tabela com tipos diferentes de "data" da coluna e tipos de migração de trilhos correspondentes, dependendo do banco de dados

Stanislav Modrák
fonte