90 votes

Intervalle dynamique (basé sur les colonnes)

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;

a.number_of_days est un nombre entier ?

231voto

araqnid Points 33350

Je multiplie généralement le nombre par interval '1 day' ou similaire, par exemple :

select now() + interval '1 day' * a.number_of_days from a;

13 votes

7 ans plus tard, c'est toujours la meilleure solution. Incroyable.

1 votes

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.

0 votes

Paul S a une solution plus souple.

38voto

Paul S Points 1039

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;

1 votes

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)

1 votes

Merci, ça m'a beaucoup aidé. Mais n'oubliez pas de changer les guillemets pour postgres : SELECT now() + CAST(a.number_of_days||' DAYS' AS Interval) as "The Future Date" FROM a;

24voto

Csanesz Points 90

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;

4voto

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 :

  • microseconde
  • millisecondes
  • deuxième
  • minute
  • heure
  • jour
  • semaine
  • mois
  • trimestre
  • année
  • décennie
  • siècle
  • millénaire

    +--------------+-------------+ | period_value | period_name | +--------------+-------------+ | 2 | minute | +--------------+-------------+

Maintenant tu peux écrire :

SELECT NOW() - (period_value::TEXT || ' ' || period_name::TEXT)::INTERVAL FROM table;

4voto

a_horse_with_no_name Points 100769

utiliser ``

Mais en général, il peut être préférable d’utiliser une colonne définie comme `` , puis vous pouvez utiliser n’importe quelle unité que vous voulez lorsque vous y stockez une valeur.

0 votes

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.

0 votes

@VLRoyrenn : secs accepte un double value donc si vous voulez des millisecondes, utilisez secs => 0.001

Prograide.com

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.

Powered by:

X