Von Now () zu Current_timestamp in Postgresql

75

In MySQL kann ich dies tun:

SELECT *
FROM table
WHERE auth_user.lastactivity > NOW() - 100

jetzt in postgresql benutze ich diese Abfrage:

SELECT *
FROM table
WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - 100

aber ich bekomme diesen Fehler:

operator does not exist: timestamp with time zone - integer

Wie kann ich lösen?

xRobot
quelle

Antworten:

131

Verwenden Sie ein Intervall anstelle einer Ganzzahl:

SELECT *
FROM table
WHERE auth_user.lastactivity > CURRENT_TIMESTAMP - INTERVAL '100 days'
Mark Byers
quelle
33

Sie können auch now()in Postgres verwenden. Das Problem ist, dass Sie keine ganzen Zahlen von timestampoder addieren / subtrahieren können timestamptz. Sie können entweder tun, was Mark Byers vorschlägt, und ein Intervall subtrahieren oder den dateTyp verwenden, mit dem Sie Ganzzahlen addieren / subtrahieren können

SELECT now()::date + 100 AS date1, current_date - 100 AS date2
Scott Bailey
quelle
4
Kein Downvoting, aber: INTERVALL macht deutlich, in welcher Einheit Sie arbeiten, wenn Sie Datumsberechnungen durchführen. Zum Beispiel ist es nicht offensichtlich, welchen zukünftigen Zeitpunkt dies now()::date + 100darstellt. Gibt es einen Fall, in dem Ganzzahlmathematik gegenüber INTERVALLMathematik erforderlich ist?
Chris Betti
6

Hier ist ein Beispiel ...

select * from tablename where to_char(added_time, 'YYYY-MM-DD')  = to_char( now(), 'YYYY-MM-DD' )

added_time ist ein Spaltenname, den ich zur Übereinstimmung in char konvertiert habe

Rohit Sonawane
quelle
Das funktioniert sehr langsam, da die Operation für jede Zeile berechnet wird. Daher kann der Index für eine einfache added_timeSpalte nicht verwendet werden . Natürlich können Sie einen Funktionsindex erstellen, der in to_char(added_time, 'YYYY-MM-DD')diesem Fall als Overhead bezeichnet wird.
Hubbitus
6

Folgendes sagen die MySQL-Dokumente NOW():

Gibt das aktuelle Datum und die aktuelle Uhrzeit als Wert YYYY-MM-DD HH:MM:SSoder YYYYMMDDHHMMSS.uuuuuuFormat zurück, je nachdem, ob die Funktion in einer Zeichenfolge oder in einem numerischen Kontext verwendet wird. Der Wert wird in der aktuellen Zeitzone ausgedrückt.

mysql> SELECT NOW();
        -> '2007-12-15 23:50:26'
mysql> SELECT NOW() + 0;
        -> 20071215235026.000000

Jetzt können Sie Ihr Smart Date sicherlich auf etwas weniger reduzieren ...

SELECT (
 date_part('year', NOW())::text
 || date_part('month', NOW())::text
 || date_part('day', NOW())::text
 || date_part('hour', NOW())::text
 || date_part('minute', NOW())::text
 || date_part('second', NOW())::text
)::float8 + foo;

Aber das wäre eine wirklich schlechte Idee. Was Sie verstehen müssen, ist, dass Zeiten und Daten keine dummen, nicht formulierten Zahlen sind, sondern ein eigener Typ mit eigenen Funktionen und Operatoren

Mit der MySQL-Zeit können Sie also im Wesentlichen NOW()einen dümmeren Typ behandeln oder +eine Vermutung überschreiben , die ich in den MySQL-Dokumenten nicht finden kann. In jedem Fall möchten Sie sich wahrscheinlich die dateund intervalTypen in pg ansehen .

Evan Carroll
quelle
-2
select * from table where column_date > now()- INTERVAL '6 hours';
Luis Carlos Herrera Santos
quelle
3
Während dies die Frage beantworten könnte, geben Sie bitte auch eine kurze Erklärung, was Ihr Code tut und warum er das anfängliche Problem löst.
user1438038