Subtrahieren von 1 Tag von einem Zeitstempeldatum

100

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:

  1. Wenden Sie einen mathematischen Operator an, um 1 Tag zu subtrahieren
  2. Filtern Sie es basierend auf einem Zeitfenster von heute - 130 Tagen
  3. Anzeige ohne den hh / mm / ss-Teil des Stempels (31.10.2016)

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 stimmt mit dem angegebenen Namen und den angegebenen Argumenttypen überein. Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen. Position: 69

Die now()Klausel erzeugt eine ähnliche Meldung:

[42883] FEHLER: Operator existiert nicht: Zeitstempel mit Zeitzone - Ganzzahl Hinweis: Kein Operator stimmt mit dem angegebenen Namen und den angegebenen Argumenttypen überein. Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen. Position: ...

Online-Anleitungen zum Schreiben von Casts sind besonders wenig hilfreich. Input wird geschätzt.

J-Ko
quelle

Antworten:

232

Verwenden Sie den INTERVALTyp dazu. 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 Abfrage 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;


TIPPS

Tipp 1

Sie können mehrere Operanden anhängen. ZB: Wie komme ich zum letzten Tag des aktuellen Monats?

SELECT date_trunc('MONTH', CURRENT_DATE) + INTERVAL '1 MONTH - 1 DAY';

Tipp 2

Sie können ein Intervall auch mit der make_intervalFunktion 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);


Mehr Info:

Datums- / Zeitfunktionen und Operatoren

Datentyp-Datum / Uhrzeit (Sonderwerte) .

Michel Milezzi
quelle
1
Für diejenigen, die sich gefragt haben, ist "Allballs" ein Wort für Mitternacht, weil es wie 00:00:00 aussieht.
wim