2009-06-16 4 views
2

Si vous avez besoin de votre application Web pour traduire les fuseaux horaires par utilisateur, pourquoi ne pas utiliser TIMESTAMP pour tous les champs de date/heure? Considérez que les valeurs TIMESTAMP sont stockées dans UTC et converties dans le fuseau horaire défini pour la connexion lors de la récupération.Pourquoi ne pas utiliser TIMESTAMP de MySQL à travers le tableau?

J'ai posé cette question sur IRC, lu la documentation de MySQL, j'ai beaucoup cherché sur Google et j'ai demandé à mes collègues, et je n'ai pas encore trouvé de raison impérieuse de ne pas utiliser TIMESTAMP.

Note: Je comprends que TIMESTAMP a une gamme limitée de 1970 - 2038; cela ne va pas être un problème dans mon cas. En outre, j'utilise PHP avec MySQL.

Répondre

1

TIMESTAMP est quand vous voulez que l'heure soit mise à jour automatiquement. Si vous voulez savoir quand la ligne a été insérée/mise à jour, utilisez un TIMESTAMP.

En outre, gardez à l'esprit qu'un TIMESTAMP est seulement stocké dans UTC - il est converti en fuseau horaire local du serveur avant qu'il ne soit retransmis dans le cadre d'une requête.

Dans votre cas, il est préférable d'utiliser un DATETIME. Si vous vous inquiétez pour l'UTC, c'est très bien. Il suffit de créer vos dates en UTC plutôt que d'utiliser l'heure locale. Utilisez UTC_TIMESTAMP.

+0

Merci pour la réponse, mais je ne comprends pas pourquoi je préfère utiliser DATETIME, étant donné que je devrais faire manuellement les conversions 100s de places dans mon code, où que j'utilise les fonctions de date PHP, quand le gestionnaire de base de données ce travail pour moi. –

+0

Vous devez faire cette conversion de date quand même. TIMESTAMP retournera converti à l'heure du serveur local. Ce n'est pas le fuseau horaire de l'utilisateur. Vous devez stocker vos dates en UTC et les convertir au fuseau horaire de l'utilisateur au niveau de l'interface utilisateur. – Randolpho

+0

Que se passe-t-il si je lance "SET time_zone = 'le fuseau horaire des utilisateurs'" à chaque fois qu'une connexion à la base de données est établie dans la session de l'utilisateur? Est-ce que ce serait une bonne solution, dans votre esprit? –

1

Je pense que votre réponse est ici:

Je comprends timestamp une gamme limitée de 1970-2038; cela ne va pas être un problème dans mon cas.

Je serais des hypothèses de prise attention à la longévité des projets en particulier en ce qui concerne les schémas de base de données. Les bases de données ont tendance à rester en place et à être utilisées longtemps après la disparition des applications qui les ont utilisées. DATETIME est pour les dates et heures arbitraires que vous utilisez dans vos données.

+1

De toute évidence, MySQL aurait publié un correctif pour le problème de 2038 - d'autant plus que la grande majorité des ordinateurs seront en 64 bits d'ici là? –

+2

Peut-être qu'ils le feront, mais une partie d'être un développeur à succès est de planifier le pire plutôt que d'espérer le meilleur. –

+0

Si vous trouvez comment modifier une table dans 25 ans, il est sur votre liste de choses qui valent la peine de passer votre temps, vous êtes dans une forme loin, beaucoup mieux que la plupart d'entre nous. – DougW

0

La réponse de Randalpho est fausse sur beaucoup de faits!

Les horodatages n'ont pas besoin d'être mis à jour automatiquement lors de la création OU des mises à jour.

En outre, les horodatages sont traduits à l'heure locale du CLIENT, pas à celle du serever.

Regardez simplement les documents MySQL pour datetime.

+0

Ceci est vraiment un commentaire, pas une réponse. Avec un peu plus de rep, [vous serez en mesure de poster des commentaires] (http://stackoverflow.com/privileges/comment). – Emil

Questions connexes