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.

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.