web-dev-qa-db-ja.com

動的(列ベース)間隔

NOWに動的な(列ベースの)日数を追加するにはどうすればよいですか?

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

どこ a.number_of_daysは整数ですか?

55
explodes

私は通常、その数にinterval '1 day'またはそれに類似した値を掛けます。例:

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

私はこれが1歳であることを知っていますが、列を使用して実際の間隔(たとえば、「日」、「月」)を指定する必要がある場合は、次のようにして文字列を間隔にキャストすることもできます。

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

したがって、元の質問は次のようになります。

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

私はこの方法を好みます。とても簡単できれいだと思います。 postgreでは​​、interval+演算子をtimestampとともに使用する必要があります

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

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

ここでは、秒、分、日、月などを使用でき、列の数値を置き換えることができます。

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

列の値に基づいて間隔を作成するには、テーブルに2つの列を追加することをお勧めします。たとえば、列「period_value」:: INT4および列「period_name」:: VARCHAR。列「period_name」には、次の値を格納できます。

  • マイクロ秒
  • ミリ秒
  • 二番目
  • 時間
  • 週間
  • 四半期
  • 十年
  • 世紀
  • ミレニアム
 + -------------- + ------------- + 
 | period_value | period_name | 
 + -------------- + ------------- + 
 | 2 |分| 
 + -------------- + ------------- + 

今、あなたは書くことができます:

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

「41年11月4日」などの間隔文字列値を持つフィールドがあり、それを生年月日に変換する場合は、次のクエリを使用します。

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

dobは、変換する日付フィールドです'41年11月4日'から'1972/10/14 'たとえば
patient_ageは、「41年11月4日」のような文字列を持つvarcharフィールドです

そしてこれは年齢を生年月日に戻すクエリです

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