Ich benutze Datagrip für Postgresql. Ich habe eine Tabelle mit einem Datumsfeld im Zeitstempelformat (ex: 2016-11-01 00:00:00)
. Ich möchte in der Lage sein:
Aktuelle Startabfrage:
select org_id, count(accounts) as count, ((date_at) - 1) as dateat
from sourcetable
where date_at <= now() - 130
group by org_id, dateat
Die ((date_at)-1)
- Klausel in Zeile 1 führt zu:
[42883] FEHLER: Operator existiert nicht: Zeitstempel ohne Zeitzone - Ganzzahl Hinweis: Kein Operator entspricht den angegebenen Namen und Argumenttypen. Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen. Position: 69
Die now()
-Klausel erzeugt eine ähnliche Nachricht:
[42883] FEHLER: Operator existiert nicht: Zeitstempel mit Zeitzone - Ganzzahl Hinweis: Kein Operator entspricht den angegebenen Namen und Argumenttypen. Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen. Position: ...
Online-Anleitungen für Typumwandlungen sind ausgesprochen wenig hilfreich. Input wird geschätzt.
Verwenden Sie dazu den Typ INTERVAL
. Z.B:
--yesterday
SELECT NOW() - INTERVAL '1 DAY';
--Unrelated to the question, but PostgreSQL also supports some shortcuts:
SELECT 'yesterday'::TIMESTAMP, 'tomorrow'::TIMESTAMP, 'allballs'::TIME;
Dann können Sie bei Ihrer Anfrage Folgendes tun:
SELECT
org_id,
count(accounts) AS COUNT,
((date_at) - INTERVAL '1 DAY') AS dateat
FROM
sourcetable
WHERE
date_at <= now() - INTERVAL '130 DAYS'
GROUP BY
org_id,
dateat;
Zusätzlicher Tipp¹
Sie können mehrere Operanden anhängen. Zum Beispiel: Wie bekomme ich den letzten Tag des aktuellen Monats?
SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1MONTH - 1DAY';
Zusätzlicher Tipp²
Sie können ein Intervall auch mit der Funktion make_interval
Erstellen. Dies ist nützlich, wenn Sie es zur Laufzeit erstellen müssen (ohne Literale):
SELECT make_interval(days => 10+2);
SELECT make_interval(days => 1, hours => 2);
SELECT make_interval(0, 1, 0, 5, 0, 0, 0.0);