So fügen Sie die Anzahl der Tage in postgresql datetime hinzu

77

Ich habe eine folgende Tabelle projects.

id title        created_at                     claim_window
1  Project One  2012-05-08 13:50:09.924437     5
2  Project Two  2012-06-01 13:50:09.924437     10

A) Ich möchte die Frist mit der Berechnung finden deadline = created_at + claim_window(No. of days).

So etwas wie folgen.

id title        created_at                     claim_window deadline
1  Project One  2012-05-08 13:50:09.924437     5            2012-05-13 13:50:09.924437
2  Project Two  2012-06-01 13:50:09.924437     10           2012-06-11 13:50:09.924437

B] Ich möchte auch die Projekte finden, deren Frist abgelaufen ist

id title        created_at                     claim_window deadline
1  Project One  2012-05-08 13:50:09.924437     5            2012-05-13 13:50:09.924437

Ich versuche so etwas wie folgendes.

SELECT * FROM "projects" WHERE (DATE_PART('day', now()- created_at) >= (claim_window+1))

Aber aus irgendeinem Grund funktioniert es nicht.

Salil
quelle

Antworten:

130

Dies gibt Ihnen die Frist:

select id,  
       title,
       created_at + interval '1' day * claim_window as deadline
from projects

Um alle Projekte zu erhalten, bei denen die Frist abgelaufen ist, verwenden Sie:

select *
from (
  select id, 
         created_at + interval '1' day * claim_window as deadline
  from projects
) t
where localtimestamp at time zone 'UTC' > deadline
ein Pferd ohne Name
quelle
aber ein weiteres Problem tritt auf, mein created_at hat Datentyp timestamp without time zoneUND current_timestamp hat Datentyp timestamp with time zone, daher bekomme ich keine richtige Antwort
Salil
@ Salil: LOCALTIMESTAMPist eintimestamp without time zone
a_horse_with_no_name
@Salil: Es spielt auch keine Rolle, das Ergebnis wäre entweder mit timestampoder identisch timestamptz, solange sich die Daten auf denselben Zeitpunkt beziehen. Das Hinzufügen eines Tages hat für beide den gleichen Effekt.
Erwin Brandstetter
Mein create_at wird in der UTC-Zeit (ohne Zeitzone) gespeichert und LOCALTIMESTAMP & CURRENT_TIMESTAMP geben mir Zeit in +5.30, daher werden Probleme immer noch nicht gelöst
Salil
@Salil: Berechnen Sie dann den Ortszeitstempel für utc neu, indem Sielocaltimestamp at time zone 'UTC'
a_horse_with_no_name
17

Für mich musste ich das gesamte Intervall in einfache Anführungszeichen setzen, nicht nur den Wert des Intervalls.

select id,  
   title,
   created_at + interval '1 day' * claim_window as deadline from projects   

Anstatt

select id,  
   title,
   created_at + interval '1' day * claim_window as deadline from projects   

Postgres Datums- / Zeitfunktionen

Jason Silver
quelle