2009-03-06 13 views
0

Ich habe ein Skript, das jede Minute E-Mails versendet. Wenn es seine Schleife startet, fragt es die Datenbank nach allen Einträgen ab, die gleich der aktuellen Uhrzeit sind. Ich möchte, dass alle Einträge in der Datenbank, die der aktuellen Zeit entsprechen, minutengenau gefunden werden.Wählen Sie alle Zeilen, die einer Zeit entsprechen

So gibt es eine 'Zeit' Spalte, die die Uhrzeit speichert: '2009-03-06 20:18:31'. Bei der Suche gibt es eine Möglichkeit, das Attribut seconds zu ignorieren, ohne die Zeit zu ändern.

EDIT: Ich benutze MySQL-Server.

Danke!

+0

Welche Plattform verwenden Sie? – Quassnoi

+0

@Quassnoi Ich habe gerade die Frage bearbeitet, ich werde mysql verwenden. – vrish88

Antwort

0

Dies war die eigentliche SQL-Anweisung, die ich verwendet habe. Beachten Sie, dass Quassnoi die Antwort stark beeinflusst hat, aber es gibt einige wichtige Unterschiede. Ich habe das UTC_TIMESTAMP anstelle von NOW() verwendet.

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

ich diese Logik durchgeführt habe vor:

Abfrage für: Timefield> = (jetzt - 1 Minute).

Sie können diese Logik auch ändern, um nach TimeField> = (Now - Anzahl der Sekunden, die in der aktuellen Minute vergangen sind) abzufragen - dies könnte die gesuchten Informationen genauer abrufen.

0

Stellen Sie sicher, dass Sie die Berechnung für den "jetzt" -Teil der Ungleichung durchführen. In SQL Server können Sie DATEADD (mi, -1, GETDATE()) verwenden. Wenn Sie die Funktion für die Spalte ausführen, wird wahrscheinlich eine RBAR-Operation generiert.

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

Dies wird auf SQL Server arbeiten, aber da Sie nicht angeben, welche Server Sie ist es schwer zu sagen, ob es für Sie arbeiten verwenden.

+0

SQL Server wird jedoch keinen Index für das Zeitfeld für diese Abfrage verwenden. –

3

In MySQL:

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

Dies wird effizient einen Index für time Feld.

Verwandte Themen