web-dev-qa-db-fra.com

Intervalle dynamique (basé sur une colonne)

Comment ajouter un nombre de jours dynamique (basé sur une colonne) à MAINTENANT?

SELECT NOW() + INTERVAL a.number_of_days "DAYS" AS "The Future Date" 
FROM a;

a.number_of_days est un entier?

55
explodes

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;
138
araqnid

Je sais que cela a un an, mais si vous devez utiliser une colonne pour spécifier l'intervalle réel (par exemple, `` jours '', `` mois '', alors il vaut la peine de savoir que vous pouvez également CAST votre chaîne à un intervalle, donnant:

SELECT now()+ CAST(the_duration||' '||the_interval AS Interval)

Donc, la question d'origine deviendrait:

SELECT now() + CAST(a.number_of_days||" DAYS" AS Interval) as "The Future Date" FROM a;
23
Paul S

Je préfère cette façon. Je pense que c'est assez facile et propre. Dans postgre, vous avez besoin de interval pour utiliser + opérateur avec timestamp

select (3||' seconds')::interval;

select now()+ (10||' seconds')::interval,now();

où vous pouvez utiliser des secondes, des minutes ... des jours, des mois ... et vous pouvez remplacer les chiffres de votre colonne.

select now()+ (column_name||' seconds')::interval,now()
from your_table;
9
SüniÚr

Pour créer des intervalles basés sur des valeurs de colonne, je recommande d'ajouter deux colonnes dans votre tableau. Par exemple, la colonne "valeur_période" :: INT4 et la colonne "nom_période" :: VARCHAR. La colonne "nom_période" peut stocker les valeurs suivantes:

  • microseconde
  • millisecondes
  • seconde
  • minute
  • heure
  • journée
  • la semaine
  • mois
  • trimestre
  • an
  • décennie
  • siècle
  • millénaire
 + -------------- + ------------- + 
 | period_value | nom_période | 
 + -------------- + ------------- + 
 | 2 | minute | 
 + -------------- + ------------- + 

Vous pouvez maintenant écrire:

SELECT NOW() - (period_value::TEXT || ' ' || period_name::TEXT)::INTERVAL FROM table;
4
Igor Manturov Jr.

Si nous avons un champ avec une valeur de chaîne d'intervalle telle que '41 ans 11 mois 4 jours 'et que nous voulons le convertir en date de naissance, utilisez cette requête:

UPDATE "february14" set dob = date '2014/02/01'  - (patient_age::INTERVAL) 

dob est le champ de date à convertir '41 ans 11 mois 4 jours' à '1972/10/14 ' par exemple
patient_age est un champ varchar qui a une chaîne comme '41 ans 11 mons 4 jours '

Et c'est une requête pour convertir l'âge en date de naissance

SELECT now() - INTERVAL '41 years 10 mons 10 days';
0
Mohammad Yusuf