Comment ajouter un nombre de jours dynamique (basé sur une colonne) à NOW ?
SELECT NOW() + INTERVAL a.number_of_days "DAYS" AS "The Future Date"
FROM a;
Où a.number_of_days
est un nombre entier ?
Comment ajouter un nombre de jours dynamique (basé sur une colonne) à NOW ?
SELECT NOW() + INTERVAL a.number_of_days "DAYS" AS "The Future Date"
FROM a;
Où a.number_of_days
est un nombre entier ?
Joli tour de passe-passe, mais il me semble que les meilleures solutions sont celles ci-dessous, où le(s) champ(s) concaténé(s) est (sont) converti(s) en un intervalle, en utilisant CAST ou ::interval.
Je sais que cela date d'un an, mais si vous avez besoin d'utiliser une colonne pour spécifier l'intervalle réel (par exemple, "jours", "mois"), il est bon de savoir que vous pouvez également convertir votre chaîne en un intervalle, en donnant.. :
SELECT now()+ CAST(the_duration||' '||the_interval AS Interval)
Ainsi, la question originale deviendrait :
SELECT now() + CAST(a.number_of_days||" DAYS" AS Interval) as "The Future Date" FROM a;
Si vous voulez avoir plus de contrôle sur les valeurs de la colonne des unités, vous pouvez la décoder vous-même : 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)
Je préfère cette méthode. Je pense que c'est assez facile et propre. Dans postgre, vous avez besoin de interval
à utiliser +
opérateur avec timestamp
select (3||' seconds')::interval;
select now()+ (10||' seconds')::interval,now();
où vous pouvez utiliser les secondes, les minutes... les jours, les mois... et vous pouvez remplacer les chiffres dans votre colonne.
select now()+ (column_name||' seconds')::interval,now()
from your_table;
Pour créer des intervalles basés sur les valeurs des colonnes, je recommande d'ajouter deux colonnes dans votre table. Par exemple, la colonne "period_value"::INT4 et la colonne "period_name"::VARCHAR. La colonne "period_name" peut stocker les valeurs suivantes :
millénaire
+--------------+-------------+ | period_value | period_name | +--------------+-------------+ | 2 | minute | +--------------+-------------+
Maintenant tu peux écrire :
SELECT NOW() - (period_value::TEXT || ' ' || period_name::TEXT)::INTERVAL FROM table;
days => a.number_of_days
semble être la syntaxe des mots-clés de Postgres, et make_interval n'a que des paramètres pour years
, months
, weeks
, days
, hours
, mins
y secs
. Cela signifie que cela ne fonctionnerait pas pour toutes les unités comme interval '1 millisecond' * msTime
mais c'est quand même une bonne alternative dans la plupart des cas.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.