2009-03-06 4 views
0

J'ai un script qui envoie des emails toutes les minutes. Lorsqu'il démarre sa boucle, il interroge la base de données pour toutes les entrées qui sont égales à l'heure utc en cours. Je voudrais qu'il trouve toutes les entrées dans la base de données qui correspondent à l'heure actuelle à la minute. Il y a donc une colonne 'time' qui stocke l'heure utc: '2009-03-06 20:18:31'. Quand il cherche est-il possible d'ignorer l'attribut seconds sans changer comment je stocke l'heure?Sélectionnez toutes les lignes qui correspondent à un temps

EDIT: J'utilise le serveur mysql.

Merci!

+0

Quelle plate-forme utilisez-vous? – Quassnoi

+0

@Quassnoi Je viens d'éditer la question, je vais utiliser mysql. – vrish88

Répondre

0

c'était l'instruction sql réelle que j'ai utilisée. Notez qu'il a été fortement influencé par la réponse de Quassnoi, mais il y a quelques différences clés. J'ai utilisé le UTC_TIMESTAMP au lieu de NOW().

select * 
from table 
where time < UTC_TIMESTAMP() + INTERVAL(1) MINUTE - INTERVAL (EXTRACT(SECOND FROM UTC_TIMESTAMP())) SECOND 
and time >= UTC_TIMESTAMP() - INTERVAL (EXTRACT(SECOND FROM UTC_TIMESTAMP())) SECOND; 
0

J'ai réalisé cette logique avant:

requête pour: TimeField> = (maintenant - 1 minute).

Vous pouvez également modifier cette logique pour interroger TimeField> = (maintenant - nombre de secondes écoulées dans la minute actuelle) - cela pourrait plus précisément récupérer ce que vous recherchez.

0

Assurez-vous de faire le calcul sur la partie "maintenant" de l'inégalité. Dans SQL Server, vous pouvez utiliser DATEADD (mi, -1, GETDATE()). Si vous exécutez la fonction sur la colonne, vous finirez probablement par générer une opération RBAR.

0
where datediff(minute, Time, getdate()) = 0 

Cela fonctionne sur SQL Server, mais comme vous ne spécifiez pas ce serveur que vous utilisez il est difficile de dire si cela fonctionnera pour vous.

+0

SQL Server n'utilisera cependant pas un index sur le champ heure pour cette requête. –

3

En MySQL:

SELECT * 
FROM table 
WHERE time >= NOW() - INTERVAL EXTRACT(SECOND FROM NOW()) SECOND 
     AND time < NOW() - INTERVAL (EXTRACT(SECOND FROM NOW()) + 60) SECOND 

Cela utilisera efficacement un index sur le terrain time.

Questions connexes