2009-01-14 10 views
1

J'ai une colonne date et time dans ma table mysql, respectivement start_date et start_time. Je veux que mes utilisateurs puissent se faire des rappels X heures avant start_time, min. 1 heure et 24 heures maximum.MySQL calcul de date/heure

Je vais lancer un script CRON pour envoyer ces rappels. En ce moment je fais:

SELECT * FROM auctions WHERE start_date=CURDATE() AND status='0' 

Pour obtenir toutes les ventes aux enchères qui vont commencer aujourd'hui et n'ont pas encore commencé. Ma question est, comment puis-je savoir si le temps est X heures avant start_time afin que je puisse leur envoyer un rappel si c'est le cas.

Des suggestions?

Répondre

4

Quelque chose comme ceci:

SELECT col1, col2, col3 
FROM records 
WHERE (records.startDate BETWEEN NOW() AND ADDDATE(NOW(), INTERVAL 9 HOUR)) 
AND (records.status = '0'); 
2

Y at-il une raison pour laquelle vous ne pouvez pas utiliser un simple champ d'horodatage au lieu d'une date et d'un pour le temps. De cette façon, vous pouvez trouver tous ceux qui commencent dans les 5 heures (par exemple), en faisant

select * from auctions where start_ts between now() and now() + interval '5 hours'; 

Remarque: la syntaxe intervalle varie légèrement entre les bases de données, et c'est celui pour postgresql, alors vous pourriez avoir à change le légèrement pour mysql. Pouvez-vous utiliser unixtime pour gagner du temps?

0

Depuis PHP a une fonction merveilleuse appelée strtotime.

Dans vous pouvez dire. strtotime ("+ 20 heures") et obtenez l'unixtime pendant 20 heures à partir de maintenant.

Ensuite, c'est juste une question de quel champ est plus grand que l'autre, si oui, envoyez la notification.

+0

Pourquoi supposeriez-vous qu'il exécute PHP? Pour commencer, il utilisera un cronjob, c'est une indication que ce n'est peut-être pas PHP. Deuxièmement, pourquoi auriez-vous besoin d'utiliser strtotime pour calculer 20 heures en secondes? C'est maths de base ... – jishi

+0

pourquoi un cronjob indiquerait-il que ce n'est pas PHP? –

+0

en fait son php, cela montre que dans les balises –

1

Je l'ai fait de cette façon avant que toutes les réponses aient été envoyées et que ça marche. Parce que je suis sur une date limite je ne peux pas revenir en arrière et le changer :)

$sql="SELECT HOUR(ADDTIME(CURTIME(),'$hour')) as remindHour, HOUR(CURTIME()) as curHour"; 
$result=$this->db->query($sql); 

extract($result->getAllSingle()); 

if ($remindHour <=$curHour) { 
    // Send reminders 
}