2010-05-15 7 views
2

Pourquoi l'horodatage généré par la fonction PHP time() est-il si différent de SQL datetime?Quelle est la différence entre l'heure PHP et l'heure SQL?

Si je fais un date('Y-m-d', time()); en PHP, cela me donne le temps maintenant, comme il se doit. Si je prends juste la partie time() et faire:

$now = time(); 
//then execute this statement 'SELECT * FROM `reservation` WHERE created_at < $now' 

Je ne reçois rien. Mais bon, donc si la valeur de $now était 1273959833 et j'interrogé

'SELECT * FROM `reservation` WHERE created_at < 127395983300000000' 

alors je vois les dossiers que je l'ai créé. Je pense que l'un est suivi en microsecondes par rapport à l'autre en quelques secondes, mais je ne trouve aucune documentation à ce sujet! Quelle serait la bonne conversion entre ces deux?

+0

Quelle base de données sql utilisez-vous? –

+0

salut, im en utilisant MySQL 5.1.36 – Ying

Répondre

7

La fonction time() ne renvoie pas de microsecondes, elle devrait donc fonctionner si vous utilisez le type de données correct. Mais vous avez 2 types de données différents en ce moment, INT et un champ de date (pourrait être DATE/DATETIME/TIMESTAMP). Si vous voulez comparer une date dans la base de données à un horodatage en entier, vous pouvez utiliser quelque chose comme:

SELECT * FROM Tbl WHERE UNIX_TIMESTAMP(date) < $timestamp; 
+0

merci! c'était ce que je cherchais. – Ying

+1

Oui. Considérez également où l'horloge du serveur PHP est différente de l'horloge du serveur MySql - cela pourrait causer des problèmes. Surtout si elles sont sur des fuseaux horaires différents, ou différents paramètres DST. Envisagez d'avoir * tout * en format UTC. Notez que UNIX_TIMESTAMP n'est pas UTC, c'est MySql-local. – johntellsall

2

time() donne un horodatage Unix (secondes écoulées depuis 01-01-1970) - SQL veut avoir horodatages au format YYYY-mm-dd hh-ii-ss qui est fait par date() - donc si vous ne voulez pas appeler 2 fonctions PHP, utilisez simplement $now = date("Y-m-d H:i:s") ou, mieux, changez votre requête SQL en created_at < NOW().

+0

merci. il faudrait que je le précise à une certaine date, pas seulement maintenant() – Ying

1

Il s'agit simplement de 2 façons de stocker des dates, chacune avec ses avantages et ses inconvénients. Vous pouvez utiliser le champ date de MySQL, ou simplement stocker des horodatages unix dans un champ INT. Vous pouvez également utiliser:

SELECT UNIX_TIMESTAMP (field_name) DE ...

retourner un champ de date comme un timestamp Unix.

Le champ de date de MySQL est lisible par l'homme et peut stocker n'importe quelle date dans un avenir prévisible. Cependant, il ne stocke pas d'informations de fuseau horaire qui peuvent causer des problèmes sérieux si elles ne sont pas traitées correctement. Facebook a eu ce problème il y a un certain temps. Les horodatages Unix stockent les informations de fuseau horaire (puisqu'il est défini comme le nombre de secondes écoulées depuis le 1er janvier 1970 UTC à 0 h 00). Les opérations de comparaison sont plus rapides sur les entiers, et les fonctions heure/date de PHP sont conçues pour être utilisées avec les horodatages Unix. Cependant, Linux ne peut supporter que les dates de 1902 à 2038 et Windows de 1970 à 2038. MySQL et l'architecture en général passeront à des entiers 64 bits bien avant 2038, mais si vous avez besoin de stocker des dates qui sont dans un avenir lointain ou passé, le temps Unix n'est pas pour vous.

Questions connexes