Pergunta

Você recomendaria usando um datetime ou um timestamp campo, e por isso (usando o MySQL)?

Eu estou trabalhando com PHP no lado do servidor.

Foi útil?

Solução

Timestamps no MySQL são geralmente usados ??para rastrear alterações nos registros, e muitas vezes são atualizados a cada vez que o registro é alterado. Se você deseja armazenar um valor específico que você deve usar um campo de data e hora.

Se você quis dizer que você quer decidir entre usar um timestamp UNIX ou um campo MySQL datetime nativa, ir com o formato nativo. Você pode fazer cálculos dentro de MySQL que maneira ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") e é simples para alterar o formato do valor para um timestamp ("SELECT UNIX_TIMESTAMP(my_datetime)") UNIX quando você consulta o registro se você quiser operar nele com PHP.

Outras dicas

No MySQL 5 e superior, timestamp valores são convertidos a partir da zona de corrente tempo para UTC para o armazenamento, e de volta convertido de UTC para a zona de hora actual para a recuperação. (Isto ocorre somente para o tipo de dados TIMESTAMP, e não para outros tipos, tais como data e hora.)

Por padrão, o fuso horário atual para cada conexão é o tempo do servidor. O fuso horário pode ser definido em uma base por conexão, como descrito em Servidor MySQL Time Zone Suporte .

Eu sempre uso DATETIME campos para outra coisa senão metadados linha (data criado ou modificado).

Como mencionado na documentação do MySQL:

O tipo DATETIME é usado quando você precisa de valores que contém informações de data e hora. recupera e exibe MySQL DateTime valores em 'AAAA-MM-DD HH: MM: SS' formato. O intervalo suportado é '1000/01/01 00:00:00' para '9999-12-31 23:59:59'.

...

O tipo de dados TIMESTAMP tem uma gama de '1970-01-01 00:00:01' UTC para '2038/01/09 03:14:07' UTC. Tem propriedades variáveis, dependendo da versão do MySQL e do modo SQL o servidor está sendo executado.

Você é muito provável que atingiu o limite inferior em marcas de tempo de uso geral - por exemplo, armazenar data de nascimento.

A seguir exemplos mostram como o tipo de data TIMESTAMP mudou os valores depois de mudar o time-zone to 'america/new_york' onde DATETIMEis inalterados.

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

Eu converti minha resposta em artigo para que mais pessoas podem encontrar este útil, MySQL: Tipos Datetime Versus Timestamp dados

.

A principal diferença é que DATETIME é constante, enquanto TIMESTAMP é afetado pela configuração time_zone.

Por isso, só importa quando você tem - ou pode ter no futuro -. Grupos sincronizados através de fusos horários

Em palavras mais simples: Se eu tiver um banco de dados na Austrália, e tomar um despejo de banco de dados para sincronizar / preencher um banco de dados na América, então o TIMESTAMP seria atualizado para refletir o tempo real do evento na nova fuso horário, enquanto DATETIME ainda refletem a hora do evento na zona au tempo .

Um grande exemplo de DATETIME sendo usado onde TIMESTAMP deveria ter sido utilizado está em Facebook, onde os seus servidores não é completamente certo o material tempo aconteceu em diferentes fusos horários. Uma vez que eu estava tendo uma conversa em que o tempo disse que eu estava respondendo a mensagens antes que a mensagem foi realmente enviada. (Isso, é claro, também poderia ter sido causado pela tradução zona mau tempo no software de mensagens se os tempos estavam sendo postados em vez de sincronizado.)

I tomar esta decisão sobre uma base semântica.

Eu uso um timestamp quando eu preciso para gravar um ponto (mais ou menos) fixo no tempo. Por exemplo, quando um registro foi inserido no banco de dados ou quando alguma ação do usuário ocorreu.

Eu uso um campo de data e hora quando a data / hora pode ser definido e alterado arbitrariamente. Por exemplo, quando um usuário pode salvar compromissos mudar mais tarde.

TIMESTAMP é de 4 bytes versus 8 bytes para DATETIME.

http://dev.mysql.com/doc/ refman / 5.0 / en / storage-requirements.html

Mas, como scronide disse que tem um limite inferior do ano de 1970. É ótimo para qualquer coisa que possa acontecer no futuro embora;)

Eu recomendo usar não a DATETIME ou um campo TIMESTAMP. Se você deseja representar um dia específico como um todo (como um aniversário), em seguida, usar um tipo de data, mas se você está sendo mais específico do que isso, você provavelmente está interessado em gravar um momento real em oposição a uma unidade de tempo (dia, semana, mês, ano). Em vez de usar um DATETIME ou TIMESTAMP, use um BIGINT, e simplesmente armazenar o número de milissegundos desde a época (System.currentTimeMillis () se você estiver usando Java). Isto tem várias vantagens:

  1. Você fornecedor evitar lock-in. Praticamente todos os banco de dados suporta inteiros na forma relativamente similar. Suponha que você deseja mover para outro banco de dados. Você quer se preocupar com as diferenças entre valores datetime do MySQL e como a Oracle define-os? Mesmo entre diferentes versões do MySQL, TimeStamps tem um nível diferente de precisão. Foi apenas recentemente que o MySQL suportado milissegundos nas marcas de tempo.
  2. questões de fuso horário
  3. não. Tem havido alguns comentários perspicazes sobre aqui sobre o que acontece com fusos horários com os diferentes tipos de dados. Mas isso é de conhecimento comum, e seus colegas de trabalho todos tomar o tempo para aprender isso? Por outro lado, é muito difícil de confusão mudando um BigInt em um java.util.Date. Usando um BIGINT provoca uma série de problemas com fusos horários a cair no esquecimento.
  4. Não se preocupa com faixas ou precisão. Você não precisa se preocupar com o que está sendo cortado curto por intervalos de data futura (TIMESTAMP só vai a 2038).
  5. integração de ferramentas de terceiros. Usando um inteiro, é trivial para obter ferramentas 3rd party (por exemplo EclipseLink) para fazer a interface com o banco de dados. Não cada ferramenta de terceiros vai ter o mesmo entendimento de uma "data e hora", como MySQL faz. Quer tentar descobrir em Hibernate se você deve usar um objeto java.sql.Timestamp ou java.util.Date se você estiver usando esses tipos de dados personalizado? Usando a sua base de tipos de dados fazem do uso de ferramentas 3-parte trivial.

Esta questão está intimamente relacionada como você deve armazenar um valor em dinheiro (ou seja, $ 1.99) em um banco de dados. Se você usar um decimal ou o tipo de dinheiro do banco de dados, ou o pior de tudo um duplo? Todos os 3 dessas opções são terríveis, por muitos dos mesmos motivos listados acima. A solução é armazenar o valor do dinheiro em centavos usando BIGINT, e depois converter centavos de dólares quando você exibir o valor para o usuário. O trabalho do banco de dados é para armazenar dados, e não para intrepret esses dados. Todas estas extravagantes dados tipos que você vê em bancos de dados (especialmente Oracle) adicionar pouco, e começar a você no caminho para vendor lock-in.

  1. TIMESTAMP é quatro bytes vs oito bytes para DATETIME.

  2. Timestamps são também mais leve no banco de dados e indexado mais rápido.

  3. O tipo DATETIME é usado quando você precisa de valores que contém informações de data e hora. recupera e exibe MySQL DateTime valores em ‘AAAA-MM-DD HH: MM: SS’ formato. O intervalo suportado é ‘1000/01/01 00:00:00 'para‘9999-12-31 23:59:59'.

O tipo de dados TIMESTAMP tem uma gama de ‘1970-01-01 00:00:01 'UTC para‘2038/01/09 03:14:07' UTC. Tem propriedades variáveis, dependendo da versão do MySQL e do modo SQL o servidor está sendo executado.

  1. DATETIME é constante, enquanto TIMESTAMP é efetuada pela definição time_zone.

Depende da aplicação, realmente.

Considere a criação de um timestamp por um usuário para um servidor em Nova York, para um compromisso em Sanghai. Agora, quando o usuário se conecta em Sanghai, ele acessa o mesmo timestamp nomeação de um servidor espelhado em Tóquio. Ele verá o compromisso no horário de Tóquio, offset da hora original New York.

Assim, para valores que representam o tempo do usuário como um compromisso ou um horário, data e hora é melhor. Ele permite que o usuário controle a data e hora exata desejada, independentemente das configurações de servidor. O tempo de jogo é o tempo definido, não afetado pelo fuso horário do servidor, o fuso horário do usuário, ou por mudanças na forma como o horário de verão é calculado (sim ele faz mudança).

Por outro lado, para valores que representam a hora do sistema como operações de pagamento, modificações de mesa ou de registro, use sempre timestamps. O sistema não será afetado por mover o servidor para outro fuso horário, ou quando se comparam entre servidores em diferentes fusos horários.

Timestamps são também mais leve no banco de dados e indexado mais rápido.

2016 + : o que eu aconselho é definir o seu fuso horário Mysql a UTC ea utilização DATETIME:

Qualquer estrutura front-end recente (Angular 1/2, reagir, Vue, ...) pode facilmente e automaticamente converter sua UTC data e hora para a hora local.

Além disso:

(A menos que seja susceptível de alterar o fuso horário de seus servidores)


Exemplo com AngularJS

// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...

// font-end Output the localised time
{{item.my_datetime | date :'medium' }}

Todos formato de hora localizada disponível aqui: https://docs.angularjs.org/api/ng/filter/date

Um campo timestamp é um caso especial do campo datetime. Você pode criar colunas timestamp ter propriedades especiais; ele pode ser configurado para se atualizar em ambos criar e / ou atualização.

Em "maior" termos de banco de dados, timestamp tem um par de gatilhos de caso de especial sobre ele.

O que o caminho certo é depende inteiramente o que você quer fazer.

TIMESTAMP está sempre em UTC (ou seja, decorrido segundos desde 1970-01-01, em UTC), e seu servidor MySQL auto convertidos-IT para a data / hora para o fuso horário de conexão. No longo prazo, TIMESTAMP é o caminho a percorrer, porque você sabe que seus dados temporais estarão sempre em UTC. Por exemplo, você não vai estragar as datas acima se você migrar para um servidor diferente ou se você alterar as configurações de fuso horário no seu servidor.

Nota:. Conexão padrão do fuso horário é o fuso horário do servidor, mas isso pode (deve) ser alterado por sessão (ver SET time_zone = ...)

Comparação entre DATETIME, TIMESTAMP e DATE

 enter descrição da imagem aqui

O que é que [.fraction]?

  • A DATETIME ou TIMESTAMP valor pode incluir uma fração de fuga segundos parte em até microssegundos (6 dígitos) precisão. No em particular, qualquer parte fraccionada em um valor inserido em uma data e hora ou coluna TIMESTAMP é armazenada, em vez de serem descartados. Este é, naturalmente, opcional.

Fontes:

É interessante notar no MySQL você pode usar algo ao longo das linhas do abaixo ao criar suas colunas da tabela:

on update CURRENT_TIMESTAMP

Isto irá atualizar a hora em cada instância que você modificar uma linha e às vezes é muito útil para o último editar informações armazenadas. Isso só funciona com hora e data, não datetime no entanto.

Eu sempre usar um timestamp Unix quando se trabalha com MySQL e PHP. A principal razão para isso é o método data em que o padrão no PHP usa um timestamp como parâmetro, então não haveria de análise necessário.

Para obter o timestamp atual Unix em PHP, basta fazer time();
e em MySQL fazer SELECT UNIX_TIMESTAMP();.

Da minha experiência, se você quiser um campo de data em que a inserção acontece apenas uma vez e você não quer ter qualquer atualização ou qualquer outra ação nesse campo particular, ir com o tempo data .

Por exemplo, considere uma tabela user com um Data do registro campo. Nesse mesa user se você quer saber o último acesso em tempo de um usuário em particular, ir com um campo da timestamp tipo para que o campo é atualizado.

Se você está criando a tabela de phpMyAdmin a configuração padrão irá atualizar o timestamp campo quando uma atualização de linha acontece. Se o seu timestamp arquivado não está atualizando com atualização da linha, você pode usar a seguinte consulta para fazer uma timestamp campo get auto atualizado.

ALTER TABLE your_table
      MODIFY COLUMN ts_activity TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

O tipo armazena dados atualizados timestamp e tempo, mas em formato UTC, não no formato de fuso horário atual como data e hora faz. E quando você buscar dados, timestamp novamente convertidos que no tempo de fuso horário atual.

Assim, suponha que você estiver nos EUA e recebendo dados de um servidor que tem um fuso horário do EUA. Então você vai ter a data e hora de acordo com o fuso horário EUA. A coluna tipo de dados timestamp sempre são atualizados automaticamente quando a sua linha é atualizado. Por isso, pode ser útil para controlar quando uma determinada linha foi atualizada pela última vez.

Para mais informações você pode ler o post Timestamp Vs Datetime .

Eu sempre uso um timestamp Unix, simplesmente para manter a sanidade quando se lida com um monte de datetime informações, especialmente ao realizar ajustes para fusos horários, adicionando / subtraindo datas, e similares. Ao comparar timestamps, Isto exclui a fatores complicadores de fuso horário e permite recursos de reposição em seu processamento do lado do servidor (Quer se trate de código de aplicativo ou banco de dados consultas), em que você faz uso de peso leve aritmética em vez mais pesado data-hora add / subtrair funções.

Outra coisa vale a pena considerar:

Se você está construindo uma aplicação, você nunca sabe como os seus dados pode ter que ser usado para baixo da linha. Se você acabar tendo que, por exemplo, comparar um monte de registros em seu conjunto de dados, com, digamos, um monte de itens a partir de uma API de terceiros, e dizer, colocá-los em ordem cronológica, você vai ficar feliz em ter Unix timestamps para as suas fileiras. Mesmo se você decidir usar MySQL timestamps, armazenar um timestamp Unix como um seguro.

Cuidado com timestamp mudar quando você faz uma declaração UPDATE em uma tabela. Se você tiver uma tabela com colunas 'Name' (varchar), 'Age' (int), e 'DATE_ADDED' (timestamp) e você executar a seguinte instrução DML

UPDATE table
SET age = 30

então cada valor único em sua coluna 'DATE_ADDED' seria alterado para a hora atual.

Referência tomadas a partir deste artigo:

As principais diferenças:

TIMESTAMP usada para rastrear alterações nos registros e atualizar cada vez que o registro é alterado. DATETIME usado para armazenar específico e valor estático que não é afetado por quaisquer alterações nos registros.

TIMESTAMP também afetada por diferentes tempos configuração relacionada ZONE. DATETIME é constante.

TIMESTAMP convertido internamente fuso horário atual de UTC para armazenamento, e durante a volta convertido recuperação para o fuso horário atual. DATETIME não pode fazer isso.

TIMESTAMP suportado gama: ‘1970-01-01 00:00:01 'UTC para‘2038/01/19 03:14:07' UTC DATETIME suportado gama: ‘1000/01/01 00:00:00 'para‘9999-12-31 23:59:59'

No meu caso, eu definir UTC como uma zona de tempo para tudo: o sistema, o servidor de banco de dados, etc. sempre que eu posso. Se o meu cliente requer outro fuso horário, então eu configurá-lo no aplicativo.

Eu quase sempre preferem timestamps ao invés de data e hora campos, porque timestamps incluem fuso horário implicitamente. Assim, desde o momento em que o aplicativo será acessado a partir de usuários de diferentes fusos horários e você quer que eles vejam as datas e horas em seu fuso horário local, este tipo de campo faz com que seja muito fácil de fazer isso do que se os dados foram salvos na data e hora campos .

Como um plus, no caso de uma migração do banco de dados para um sistema com outro fuso horário, eu me sentiria mais confiante usando timestamps. Não quer dizer que possíveis problemas ao calcular diferenças entre dois momentos com uma mudança de tempo sumer entre e precisando de uma precisão de 1 hora ou menos.

Assim, para resumir, eu valorizo ??este vantagens de carimbo do tempo:

  • pronto para uso em (fuso horário de multi) internacional Apps
  • migrações fáceis entre fusos horários
  • muito fácil de diferenças calcular (basta subtrair ambas as datas)
  • nenhuma preocupação sobre datas de entrada / saída de um período de horário de verão

Por todas estas razões, eu escolho UTC & timestamp campos onde posible. E eu evitar dores de cabeça;)

A principal diferença é

  • um INDEX em Timestamp - funciona
  • a INDEX está em Datetime - não funciona

olhar para este post para ver problemas com Datetime indexação

Outra diferença entre Timestamp e Datetime está em Timestamp você não pode valor padrão de NULL.

Eu encontrei utilidade inigualável na capacidade de TIMESTAMP a atualização automática em si com base no tempo atual, sem o uso de gatilhos desnecessários. Isso é apenas me embora, embora TIMESTAMP é UTC como foi dito.

Ele pode acompanhar através de diferentes fusos horários, por isso, se você precisar exibir um tempo relativo, por exemplo, UTC tempo é o que você quiser.

Eu prefiro usar timestamp de modo a manter tudo em um formato bruto comum e formatar os dados em código PHP ou na sua consulta SQL. Há casos em que vem a calhar em seu código para manter tudo em segundos simples.

+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
|                                       TIMESTAMP                                       |                                 DATETIME                                 |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| TIMESTAMP requires 4 bytes.                                                           | DATETIME requires 8 bytes.                                               |
| Timestamp is the number of seconds that have elapsed since January 1, 1970 00:00 UTC. | DATETIME is a text displays 'YYYY-MM-DD HH:MM:SS' format.                |
| TIMESTAMP supported range: ‘1970-01-01 00:00:01′ UTC to ‘2038-01-19 03:14:07′ UTC.    | DATETIME supported range: ‘1000-01-01 00:00:00′ to ‘9999-12-31 23:59:59′ |
| TIMESTAMP during retrieval converted back to the current time zone.                   | DATETIME can not do this.                                                |
| TIMESTAMP is used mostly for metadata i.e. row created/modified and audit purpose.    | DATETIME is used mostly for user-data.                                   |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+

Eu como um timestamp Unix, porque você pode converter em números e apenas se preocupar com o número. Além disso, você adicionar / subtrair e obter durações, etc. Em seguida, converter o resultado para Data em qualquer formato. Este código descobre quanto tempo, em minutos se passaram entre um timestamp de um documento, eo tempo atual.

$date  = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now  - $result) / 60);
$min = round($unix_diff_min);

Um TIMESTAMP requer 4 bytes, enquanto que um DATETIME requer 8 bytes.

TIMESTAMP é útil quando você tem visitantes de diferentes países com diferentes fusos horários. você pode facilmente converter o TIMESTAMP para qualquer fuso horário país

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top