Wie füge ich JETZT eine dynamische (spaltenbasierte) Anzahl von Tagen hinzu?
SELECT NOW() + INTERVAL a.number_of_days "DAYS" AS "The Future Date"
FROM a;
Wo a.number_of_days
ist eine ganze Zahl?
postgresql
intervals
explodiert
quelle
quelle
Ich weiß, dass dies ein Jahr alt ist, aber wenn Sie eine Spalte verwenden müssen, um das tatsächliche Intervall anzugeben (z. B. 'Tage', 'Monate'), sollten Sie wissen, dass Sie Ihre Zeichenfolge auch in ein Intervall umwandeln können, indem Sie Folgendes angeben:
SELECT now()+ CAST(the_duration||' '||the_interval AS Interval)
Die ursprüngliche Frage würde also lauten:
SELECT now() + CAST(a.number_of_days||" DAYS" AS Interval) as "The Future Date" FROM a;
quelle
select *, num * case unit when 'W' then '1 week'::interval when 'D' then '1 day'::interval when 'H' then '1 hour'::interval end from (values(1,'W'),(2,'D'),(3,'H')) x(num, unit)
SELECT now() + CAST(a.number_of_days||' DAYS' AS Interval) as "The Future Date" FROM a;
Ich bevorzuge diesen Weg. Ich finde es ziemlich einfach und sauber. In postgre müssen Sie
interval
verwenden+
Betreiber mittimestamp
select (3||' seconds')::interval; select now()+ (10||' seconds')::interval,now();
Hier können Sie Sekunden, Minuten ... Tage, Monate ... verwenden und die Zahlen in Ihrer Spalte ersetzen.
select now()+ (column_name||' seconds')::interval,now() from your_table;
quelle
Um Intervalle zu erstellen, die auf Spaltenwerten basieren, empfehle ich, Ihrer Tabelle zwei Spalten hinzuzufügen. Beispiel: Spalte "period_value" :: INT4 und Spalte "period_name" :: VARCHAR. In der Spalte "period_name" können folgende Werte gespeichert werden:
Jetzt können Sie schreiben:
SELECT NOW() - (period_value::TEXT || ' ' || period_name::TEXT)::INTERVAL FROM table;
quelle
interval
bereits bietet. Das Erstellen einer einzelnen Typspalteinterval
wäre eine viel bessere Lösung als dieser Hack.Verwenden
make_interval()
SELECT NOW() + make_interval(days => a.number_of_days) AS "The Future Date" FROM a;
Im Allgemeinen ist es jedoch möglicherweise besser, eine Spalte zu verwenden, die als definiert
interval
ist. Dann können Sie eine beliebige Einheit verwenden, wenn Sie dort einen Wert speichern.quelle
days => a.number_of_days
Postgres' Schlüsselwort - Syntax zu sein scheint, und hat nur make_interval Parameter füryears
,months
,weeks
,days
,hours
,mins
undsecs
. Das heißt, es würde nicht für alle Einheiteninterval '1 millisecond' * msTime
funktionieren, aber es ist in den meisten Fällen immer noch eine faire Alternative.secs
akzeptiert eindouble value
so, wenn Sie Millisekunden verwenden möchtensecs => 0.001
Wenn wir ein Feld mit einem Intervallzeichenfolgenwert wie "41 Jahre 11 Monate 4 Tage" haben und es in das Geburtsdatum konvertieren möchten, verwenden Sie diese Abfrage:
UPDATE "february14" set dob = date '2014/02/01' - (patient_age::INTERVAL)
dob ist Datumsfeld zu konvertieren '41 Jahre 11 mons 4 Tage zu ‚1972.10.14‘ zum Beispiel
patient_age ist varchar Feld , das Zeichenfolge wie '41 Jahre 11 mons 4 Tage haben
Und dies ist eine Abfrage, um das Alter wieder in das Geburtsdatum umzuwandeln
SELECT now() - INTERVAL '41 years 10 mons 10 days';
quelle
Das Aktualisieren basierend auf einer Spalten-ID war für mich eine nützliche Möglichkeit, zufällige Testdaten zu erstellen.
update study_histories set last_seen_at = now() - interval '3 minutes' * id;
quelle