2009-03-09 6 views
0

J'ai une base de données créée par un fournisseur tiers pour lequel je suis en train d'écrire une nouvelle interface utilisateur.Plage de dates En PHP?

La base de données stocke les heures de début des événements sous la forme d'horodatages unix (en GMT). Ce que j'ai besoin de faire est d'interroger ceci pour une gamme d'un jour. On peut donc supposer que je dois simplement faire:

SELECT * WHERE start > $last_night_at_midnight AND start < $tonight_at_midnight 

Le problème que je suis en cours d'exécution en est une façon simple de combiner les fonctions de date/heure en PHP pour créer ces variables. J'ai l'impression que tout ce que je fais est trop compliqué pour une procédure aussi simple.

Est-ce que quelqu'un a une solution simple à cela?

Vive

Répondre

4

Ceci est vraiment un moyen arrière de le faire, mais si vous avez besoin être en mesure de faire différentes plages de dates, pas seulement aujourd'hui ou un jour, vous pouvez combiner les fonctions impaires/date des deux langues et aller avec:

$php_start = strtotime("Some valid date expression"); 
$php_end = strtotime("Some other valid date expression"); 

$result = my_sql_query(" 
      Select * FROM someDB 
      WHERE DATE(FROM_UNIXTIME(date_column)) 
      BETWEEN FROM_UNIXTIME($php_start) AND FROM_UNIXTIME($php_end)"); 

en utilisant la DATE() dans la requête s'assure que le sql ne prendra pas la peine de regarder la partie temporelle des données, et l'utilisation de FROM_UNIXTIME pour les trois signifie que le serveur sql est cohérent dans la façon dont il dérive les dates.

Ma façon préférée d'obtenir une plage de dates pour seulement aujourd'hui:

$today_start = strtotime("today"); 
    $today_end = strtotime("+1 day", $today_start); 

strtotime est en fait mieux, je l'ai trouvé, puis en ajoutant 86400 ou quelque chose comme ça, parce que gère mieux strtotime DST. J'ai trouvé ça la semaine dernière.

+1

+1 pour l'astuce que strtotime() prend en compte DST. –

+0

Si vous effectuez des manipulations de date/heure ou des comparaisons où la plus petite unité est inférieure à un jour, N'ESSAYEZ PAS de la coder vous-même: utilisez des bibliothèques. Ils ont déjà des choses comme les bogues DST triés. – staticsan

+0

L'utilisation de la fonction DATE() a annulé mon besoin de faire une requête 'entre x et y', je dis simplement si date() = date() et il supprime le temps comme je l'espérais. –

6

Vérifiez PHP's strtotime() pour la conversion de l'anglais au format unix. Cela vous permet d'utiliser "aujourd'hui minuit" et "demain minuit" et d'autres constructions similaires, comme le démontre Paolo Bergantino.

5

strtotime - la fonction de temps PHP la plus géniale jamais créée.

$last_night_at_midnight = strtotime("today midnight"); 
$tonight_at_midnight = strtotime("tomorrow midnight"); 
+0

vous donnera à minuit * aujourd'hui *, ce qui est dans le passé plutôt que dans le futur. –

+0

Si je fais un: echo strtotime ('10 mar 2009 minuit '); Le résultat est 1236657600 ce qui se traduit par 23h. Des idées pour lesquelles cela pourrait se produire? DST? –

3

strtotime est un utile ici ...

$t1=strtotime("today"); 
$t2=strtotime("tomorrow"); 

$sql="select * from foo where timecol between $t1 and $t2"; 

Au moment de la rédaction (09-03-2009 19:06), aujourd'hui équivaut à 09-03-2009 00:00: 00 et demain équivaut à 10-03-2009 00:00:00

-1

Vous pouvez soit créer ces variables en PHP ou dans Mysql ...

$tonight_at_midnight = mktime(0,0,0); 
$last_night_at_midnight = $tonight_at_mindnight - 86400; 

Le o possibilité ther est dans SQL:


SELECT * FROM tbl1 WHERE start > UNIX_TIMESTAMP(DATE_SUB(CURDATE(), INTERVAL 1 DAY) 
AND start < UNIX_TIMESTAMP(CURDATE()) 

(non testé)

1

Si vous devez choisir jours arbitraires, utilisez gmmktime

Questions connexes