Datetime vs Timestamp dans MySQL et PHP en pratique?

24

Je ne sais pas comment spécifier mon type de données comme datetime ou timestamp, je pense que j'aurai besoin des deux mais sur les différents événements. Mon site Web vend des produits et des services dans le monde entier et dispose également d'un système de compte permettant à l'utilisateur de se connecter. Veuillez clarifier les points suivants:

  • Date et heure actuelles où le client achète des produits sur mon site Web: Datetime?
  • Date et heure de livraison en fonction de leur emplacement et de la date / heure d'achat, calculées à partir de notre système: Datetime?
  • La dernière fois qu'ils se sont connectés sur leur compte: Horodatage?

    1. Quel est le code en php pour stocker la date d'achat (date actuelle) puis la stocker dans la base de données?
    2. Veuillez expliquer comment utiliser chacun d'eux car après avoir lu de nombreuses explications sur Internet, je ne comprends toujours pas très bien.
Modulaire
la source
Il y a quelque temps, j'avais un grand projet où la performance était un must absolu, après des mois de recherche, nous avons fini par utiliser un horodatage UTC stocké dans un champ varchar, il s'est avéré être plus rapide et meilleur pour nos besoins (grand réseau social)
JasonDavis

Réponses:

29

Horodatages MySQL :

  • Sont stockés en UTC

    Ils sont convertis en UTC lors du stockage et reconvertis dans votre fuseau horaire lors de la récupération. Si vous modifiez les paramètres de fuseau horaire , les valeurs récupérées changent également.

  • Peut être automatiquement initialisé et mis à jour

    Vous pouvez définir leur valeur par défaut et / ou leur valeur de mise à jour automatique sur CURRENT_TIMESTAMP

  • Avoir une gamme de 1970-01-01 00:00:01 UTCà2038-01-19 03:14:07 UTC

Alors que MySQL datetime :

  • Ce que vous stockez, c'est ce que vous obtenez ™.

  • Avoir une gamme de 1000-01-01 00:00:00à9999-12-31 23:59:59

    Les valeurs en dehors de la plage peuvent fonctionner - mais seules les valeurs dans la plage sont garanties de fonctionner.

  • Vous pouvez stocker des dates où le jour ou le mois est égal à zéro.

    C'est la façon MySQL de stocker les anniversaires! Vous ne pouvez pas faire cela avec un TIMESTAMP, à la seule exception étant la valeur zéro de 0000-00-00.

  • Vous pouvez stocker des dates non valides, si vous en avez besoin, en mode ALLOW_INVALID_DATES .

  • Vous pouvez définir la valeur par défaut sur NOW()dans certains cas, mais le moyen préférable et plus naturel de dates automatiquement initialisées et mises à jour est TIMESTAMP.

Et bien sûr, il y a aussi DATEet TIME, qui fonctionnent comme DATETIME, mais bien sûr, DATEne se soucient pas du temps et TIMEne se soucient pas de la date. Les quatre types de données fonctionnent parfaitement avec le large éventail de fonctions de date et d'heure , mais lorsque vous mélangez des types de données, vous devez être conscient des effets de conversion .

Maintenant, à votre question: vous devez utiliser DATETIMEpartout. Pas pour des raisons techniques, mais comme vous ne savez toujours pas comment MySQL fonctionne, DATETIMEc'est le choix le plus simple. Cela signifie que vous devrez calculer l'horodatage actuel en PHP avant de le stocker, c'est aussi simple que:

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

La fonction de date de PHP fonctionne comme:

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

Le "Y-m-d H:i:s"format est celui compatible avec MySQL et en laissant le second paramètre vide, les date()appels time()pour obtenir l' horodatage UNIX actuel .

L'utilisation d'un TIMESTAMPau lieu d'un DATETIMEa la valeur ajoutée de MySQL qui assume la responsabilité de décider de l'horodatage actuel, et vous pouvez ignorer le champ lorsque vous insérez / mettez à jour. Mais comme vous envoyez déjà une requête et que le code pour obtenir l'horodatage actuel en PHP est minimal, vous pouvez tout faire en toute sécurité DATETIME.

En ce qui concerne le code réel pour stocker l'horodatage PHP dans la base de données, vous devriez regarder les objets de données PHP , et si vous n'êtes toujours pas clair, demandez plutôt à StackOverflow . Mais il y a déjà près de 1 500 questions liées , assurez-vous de les parcourir avant de les poser. Juste un indice, les déclarations préparées sont la façon dont les enfants cool le font.

yannis
la source
Hmm, cela pourrait être un problème sur la façon dont vous envoyez la requête à MySQL, ou dans votre structure de table ... StackOverflow est un meilleur endroit pour ces types de problèmes, postez-y une question avec votre structure de table et votre code php complet, et quelques détails sur le problème et ce que vous avez déjà essayé. Nous ne discutons pas vraiment des détails d'implémentation ici ...
yannis
Merci pour votre réponse. J'ai essayé d'utiliser $ mysqldate = date ("Ymd H: i: s"); $ query = INSERT INTO table VALUE ('". $ mysqldate."') sur mon code php mais il serait conservé dans MySQL sous 0000-00-00 00:00:00 dans Date (champ) - Datetime (type de données). J'ai l'intention de stocker la date et l'heure actuelles. Si je définit le type de données comme horodatage dans la base de données, comment coder en php?
modulaire
Je ne suis pas autorisé à poster de commentaire sur Stackoverflow pour le moment. Cela semble un peu dommage mais c'est comme ça qu'ils m'ont fait.
modulaire
Je suis désolé pour cela, mais si vous êtes en mode suspension temporaire, il doit y avoir une bonne raison. Maintenant, une erreur possible dans le code de votre commentaire est que vous nommez le champ comme Date, c'est un mot réservé pour le DATEtype de données et des choses étranges peuvent se produire (selon la version de MySQL), alors essayez de le renommer en quelque chose comme creationdateet voyez ce qui se passe . De plus, à partir de PHP, vous devez traiter les TIMESTAMPchamps de la même manière que les DATETIMEchamps, cela n'a pas vraiment d'importance. Leur format est le même.
yannis
Merci mille fois. Il a été trié maintenant après avoir passé presque toute la nuit à essayer de comprendre pourquoi. :)
Modulaire
2

Référence tirée de cet article:

Les principales différences:

TIMESTAMP permet de suivre les modifications apportées aux enregistrements et de les mettre à jour chaque fois que l'enregistrement est modifié. DATETIME utilisé pour stocker une valeur spécifique et statique qui n'est affectée par aucun changement dans les enregistrements.

TIMESTAMP est également affecté par différents paramètres liés à TIME ZONE. DATETIME est constant.

TIMESTAMP a converti en interne le fuseau horaire actuel en UTC pour le stockage, et pendant la récupération, il a été reconverti dans le fuseau horaire actuel. DATETIME ne peut pas faire cela.

Plage prise en charge par TIMESTAMP: '1970-01-01 00:00:01 ′ UTC à' 2038-01-19 03:14:07 'UTC DATETIME plage prise en charge:' 1000-01-01 00:00:00 ′ à '9999 -12-31 23:59:59 ′

Anvesh
la source
1
Alors, en 2040, que feriez-vous pour les modifications des enregistrements, Horodatage? Je suppose que non.
Bsienn
-1

Eh bien, je regarde cela de manière très simple. Dans votre cas, j'utiliserais les deux datetimeet timestamp. En utilisant les deux, vous n'aurez aucun problème supplémentaire avec le stockage de données ou quelque chose comme ça. Un champ supplémentaire (colonne) dans votre table n'est pas non plus un gros problème.

Donc, selon mon point de vue et mes expériences jusqu'à présent, j'utilise généralement les deux. Lorsque vous souhaitez afficher une date à votre visiteur ou la rendre compréhensible pour les visiteurs, affichez une date au format datetime.

Le format Datetime peut être pénible lorsque vous souhaitez calculer quelque chose (différence entre 2 dates, obtenir la date d'hier de la date actuelle, obtenir il y a 1 semaine de la date actuelle, obtenir la date de demain ou quelque chose comme ça.) Ce n'est pas vraiment difficile, mais vous le ferez généralement besoin de les convertir timestamp, puis de faire les choses. Et oui datetime actuel par exemple vous obtenez avec: $current = date("Y-m-d");ou $current = date("Y-m-d H:i:s");si vous voulez aussi des heures, des minutes et des secondes.

L'horodatage est juste un nombre à 11 chiffres qui ne veut vraiment rien dire. Quand vous le regardez, vous ne saurez pas à quelle date il représente. Il n'est donc pas vraiment convivial et vous ne pouvez pas l'utiliser pour simplement le faire écho et le montrer à vos visiteurs par exemple. Vous devrez le "transformer" en quelque chose de lisible. Mais il vous offre également la possibilité de le convertir facilement et de calculer différentes dates. Par exemple, si vous souhaitez obtenir l'horodatage de demain en même temps, il vous suffit d'ajouter un nombre de secondes à la date actuelle et vous avez l'horodatage de demain. Exemple: $tomorrow = time()+24*3600;Vous pouvez également obtenir facilement une différence entre deux dates en quelques secondes ou quelque chose comme ça.

Je suggère donc d'utiliser à la fois datetime et timestamp. Même si vous utilisez par exemple PhpMyadmin et que vous souhaitez consulter rapidement certaines données, cela vous sera plus facile lorsque vous verrez une date au format date-heure (exemple 2011-12-20 10:15:20:) comme ce sera le cas si vous regardez simplement le nombre à 11 chiffres. Alors utilisez les deux puis appelez et utilisez celui qui vous convient le mieux.

Si vous devez ou voulez en choisir un seul, je suggère un horodatage, sinon utilisez les deux.

marque
la source
1
-1 Les Timestamp is just a number 11 digit long which doesn't really "mean" anythinghorodatages MySQL sont stockés dans le même format que datetime. Vous devez également les convertir en horodatages php, pour effectuer les calculs que vous décrivez, OU utilisez simplement les nombreuses fonctions date / heure de MySQL et effectuez les calculs dans la base de données. Votre réponse n'a pas vraiment de sens.
yannis