Datetime vs Timestamp no MySQL e PHP na prática?

24

Não sei como especificar meu tipo de dados como data e hora ou carimbo de data / hora, acho que precisarei dos dois, mas nos diferentes eventos. Meu site vende produtos e serviços em todo o mundo e também possui um sistema de contas para o usuário efetuar login. Esclareça o seguinte:

  • Data e hora atuais em que o cliente compra produtos do meu site: Data e hora?
  • Data e hora da entrega com base em sua localização e data / hora da compra, calculadas em nosso sistema: Data e hora?
  • A última vez que eles acessaram sua conta: Registro de data e hora?

    1. Qual é o código no php para armazenar a data de compra (data atual) e depois armazenar no banco de dados?
    2. Por favor, elabore como usar cada um deles, pois, depois de ler muitas explicações na internet, ainda não entendi direito.
Modular
fonte
Há um tempo atrás, eu tinha um grande projeto em que o desempenho era uma necessidade absoluta; depois de meses de pesquisa, acabamos com um carimbo de data / hora UTC armazenado em um campo varchar, que provou ser mais rápido e melhor para nossas necessidades (grande rede social)
JasonDavis

Respostas:

29

Timestamps do MySQL :

  • São armazenados no UTC

    Eles são convertidos para UTC no armazenamento e convertidos de volta para o seu fuso horário na recuperação. Se você alterar as configurações de fuso horário , os valores recuperados também serão alterados.

  • Pode ser inicializado e atualizado automaticamente

    Você pode definir o valor padrão e / ou o valor da atualização automática como CURRENT_TIMESTAMP

  • Têm um alcance de 1970-01-01 00:00:01 UTCaté2038-01-19 03:14:07 UTC

Enquanto o MySQL datetime :

  • O que você armazena é o que você obtém ™.

  • Têm um alcance de 1000-01-01 00:00:00até9999-12-31 23:59:59

    Valores fora do intervalo podem funcionar - mas apenas valores dentro do intervalo são garantidos para funcionar.

  • Você pode armazenar datas em que dia ou mês é zero.

    Esta é a maneira MySQL de armazenar aniversários! Você não pode fazer isso com a TIMESTAMP, com a única exceção sendo o valor zero de 0000-00-00.

  • Você pode armazenar datas inválidas, se precisar delas, no modo ALLOW_INVALID_DATES .

  • Você pode definir o valor padrão NOW()em alguns casos, mas a maneira mais natural e preferível de datas inicializadas e atualizadas automaticamente é TIMESTAMP.

E é claro que também existem DATEe TIME, que funcionam da mesma forma DATETIME, mas é claro DATEque não se preocupam com tempo e TIMEnem com data. Todos os quatro tipos de dados funcionam perfeitamente com a grande variedade de funções de data e hora , mas quando você está misturando tipos de dados, deve estar ciente dos efeitos de conversão .

Agora, à sua pergunta: você deve usar em DATETIMEqualquer lugar. Não por razões técnicas, mas como você ainda não sabe como o MySQL funciona, DATETIMEé a escolha mais simples. Isso significa que você terá que calcular o registro de data e hora atual no PHP antes de armazenar, é tão fácil quanto:

$mysqldate = date("Y-m-d H:i:s"); 

A função date do PHP funciona como:

string date ( string $format [, int $timestamp = time() ] )

O "Y-m-d H:i:s"formato é compatível com o MySQL e, deixando o segundo parâmetro vazio, date()chama time()para obter o registro de data e hora atual do UNIX .

Usar um em TIMESTAMPvez de a DATETIMEtem o valor agregado do MySQL, assumindo a responsabilidade de decidir o carimbo de data / hora atual, e você pode pular o campo quando estiver inserindo / atualizando. Mas como você já está enviando uma consulta e o código para obter o registro de data e hora atual no PHP é mínimo, você pode ir com segurança DATETIMEpara tudo.

Quanto ao código real para armazenar o registro de data e hora do PHP no banco de dados, você deve examinar o PHP Data Objects e, se ainda não estiver claro, pergunte no StackOverflow . Mas já existem quase 1,5 mil perguntas relacionadas , certifique-se de passar por elas antes de fazer. Apenas uma dica, declarações preparadas é como as crianças legais fazem isso.

yannis
fonte
Hummm, isso pode ser um problema de como você envia a consulta para o MySQL ou para a estrutura da sua tabela ... O StackOverflow é um local melhor para esse tipo de problema, poste uma pergunta lá com a estrutura da tabela e seu código php completo, e alguns detalhes sobre qual é o problema e o que você já tentou. Realmente não discutimos detalhes da implementação aqui ...
yannis
Obrigado pela sua resposta. Eu tentei usar $ mysqldate = date ("Ymd H: i: s"); $ query = INSERT INTO VALUE da tabela ('". $ mysqldate."') no meu código php, mas seria mantido no MySQL como 0000-00-00 00:00:00 em Date (field) - Datetime (datatype). Pretendo armazenar a Data e Hora atuais. Se eu definir o tipo de dados como Timestamp no banco de dados, como codificar em php?
Modular
Não estou autorizado a postar nenhum comentário no Stackoverflow no momento. Parece um pouco de vergonha, mas foi assim que eles fizeram comigo.
Modular
Sinto muito por isso, mas se você estiver no modo de suspensão temporária, deve haver uma boa razão. Agora, um possível erro no código no seu comentário é que você está nomeando o campo como Date, uma palavra reservada para o DATEtipo de dados e coisas estranhas podem acontecer (dependendo da versão do MySQL), então tente renomeá-lo para algo como creationdatee veja o que acontece . Além disso, no PHP você deve tratar os TIMESTAMPcampos da mesma forma que os DATETIMEcampos, isso realmente não importa. O formato deles é o mesmo.
yannis
Graças um milhão. Foi resolvido agora depois de passar quase a noite inteira tentando descobrir o porquê. :)
modular
2

Referência retirada deste artigo:

As principais diferenças:

TIMESTAMP usado para rastrear alterações nos 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 o fuso horário atual em UTC para armazenamento e, durante a recuperação, converteu novamente no fuso horário atual. DATETIME não pode fazer isso.

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 ′

Anvesh
fonte
11
Então, no ano de 2040, o que você usaria para alterar os registros, Timestamp? Eu acho que não.
Bsienn
-1

Bem, eu olho para isso de uma maneira muito simples. No seu caso, eu usaria ambos datetimee timestamp. Com o uso de ambos, você não terá problemas adicionais com o armazenamento de dados ou algo assim. Um campo adicional (coluna) na sua tabela também não é um grande problema.

Então, no meu ponto de vista e experiências até agora, costumo usar os dois. Quando você quiser mostrar uma data para o visitante ou torná-la compreensível para os visitantes, exiba uma data no formato de data e hora.

O formato de data e hora pode ser um problema quando você deseja calcular algo (diferença entre duas datas, obter a data de ontem da data atual, obter uma semana atrás da data atual, obter a data de amanhã ou algo assim.) Não é realmente difícil, mas você geralmente precisa convertê-los timestampe depois fazer as coisas. E sim data e hora atual, por exemplo, com: $current = date("Y-m-d");ou$current = date("Y-m-d H:i:s"); se também deseja horas, minutos e segundos.

O carimbo de data e hora é apenas um número com 11 dígitos, o que realmente não "significa" nada. Quando você olhar para ele, não saberá qual a data que representa. Portanto, não é realmente fácil de usar e você não pode usá-lo apenas para fazer eco e mostrá-lo aos visitantes, por exemplo. Você precisará "transformá-lo" em algo legível. Mas também oferece a capacidade de convertê-lo facilmente e calcular datas diferentes. Por exemplo, se você deseja obter o carimbo de data e hora de amanhã ao mesmo tempo, basta adicionar o número de segundos à data atual e ter o carimbo de hora de amanhã. Exemplo:$tomorrow = time()+24*3600; Você também pode obter facilmente uma diferença entre duas datas em segundos ou algo assim.

Então, eu sugiro usar data e hora e carimbo de data / hora. Mesmo que você use, por exemplo, o PhpMyadmin e deseje analisar rapidamente alguns dados, será mais fácil para você quando vir uma data no formato de data e hora (exemplo:2011-12-20 10:15:20 :), como será se você apenas olhar para o número de 11 dígitos. Portanto, use os dois e depois ligue e use o que melhor lhe convier.

Se você deve ou deseja escolher apenas um, sugiro o carimbo de data / hora, caso contrário, use ambos.

Marca
fonte
11
-1 Os Timestamp is just a number 11 digit long which doesn't really "mean" anythingregistros de data e hora do MySQL são armazenados no mesmo formato que data e hora. Você também precisa convertê-los em carimbos de data e hora php, para fazer os cálculos descritos, ou simplesmente usar as muitas funções de data / hora do MySQL e fazer os cálculos no banco de dados. Sua resposta realmente não faz sentido.
yannis