Wählen Sie nur die Zeitstempel von heute (seit Mitternacht)
Ich habe einen server mit PostgreSQL 8.4 wird neu gestartet jede Nacht um 01:00 Uhr (Fragen Sie nicht) und brauchen, um eine Liste der verbundenen Benutzer (d.h. deren Zeitstempel u.login > u.logout
):
SELECT u.login, u.id, u.first_name
FROM pref_users u
WHERE u.login > u.logout and
u.login > now() - interval '24 hour'
ORDER BY u.login;
login | id | first_name
----------------------------+----------------+-------------
2012-03-14 09:27:33.41645 | OK171511218029 | Alice
2012-03-14 09:51:46.387244 | OK448670789462 | Bob
2012-03-14 09:52:36.738625 | OK5088512947 | Sergej
Aber im Vergleich u.login > now()-interval '24 hour'
liefert auch die Anwender, bevor die letzten 01:00, das ist schlecht, insb. in den morgen.
Gibt es eine effiziente Möglichkeit, Holen Sie sich die logins seit der letzten 01:00 ohne string-Akrobatik mit to_char()
?
InformationsquelleAutor der Frage Alexander Farber | 2012-03-15
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Inspiriert von @Franks Kommentar, den ich lief einige tests und passte meine Abfrage entsprechend. Dieser sollte 1) korrekt und 2) so schnell wie möglich:
Da gibt es keine Zukunft Zeitstempel in der Tabelle (ich nehme an), Sie brauchen keine Obere Schranke.
date_trunc('day', now())
ist fast das gleiche wienow()::date
(oder einige andere alternativen unten), nur dass es gibttimestamp
statt einerdate
. Beides führt zu einertimestamp
sowieso nach dem hinzufügen einerinterval
.Unten Ausdrücken führen etwas anders. Sie ergeben leicht unterschiedliche Ergebnisse, weil
localtimestamp
gibt Daten Typtimestamp
währendnow()
gibttimestamp with time zone
. Aber wenn der Zauber zudate
entweder konvertiert die gleichen lokalen Datum, und einetimestamp [without time zone]
wird davon ausgegangen, dass in der lokalen Zeitzone. Also, wenn im Vergleich zu den entsprechendentimestamp with time zone
Sie alle in der gleichen UTC-Zeitstempel intern. Mehr details über Zeit-zone Handhabung in in diesem Zusammenhang Frage.Best-of-five. Getestet mit PostgreSQL 9.0. Wiederholt 9.1.5: konsistente Ergebnisse innerhalb von 1 % Fehlerquote.
now()::date
ist offensichtlich etwas schneller alsCURRENT_DATE
.InformationsquelleAutor der Antwort Erwin Brandstetter
Einen einfachen Weg, der immer nur Zeit-Stempel für den aktuellen Tag ab 01:00 ist es zu filtern, mit
CURRENT_DATE + interval '1 hour'
Also deine Abfrage sollte wie folgt Aussehen:
Hoffe, das hilft.
InformationsquelleAutor der Antwort Frank Bollack
Diese arbeiten für mich - es werden ALLE Zeilen mit dem heutigen Datum.
InformationsquelleAutor der Antwort Suisse
Dies funktioniert gut für mich!
InformationsquelleAutor der Antwort Vivegan
InformationsquelleAutor der Antwort Clodoaldo Neto