PostgreSQLでは、make_interval()
関数は、年、月、週、日、時間、分、秒のフィールドから間隔を作成します。
年、月、週、日、時間、分、秒のフィールドを指定すると、間隔で間隔が返されます。 データ型。
構文
この関数の構文は次のとおりです。
make_interval(years int DEFAULT 0, months int DEFAULT 0, weeks int DEFAULT 0, days int DEFAULT 0, hours int DEFAULT 0, mins int DEFAULT 0, secs double precision DEFAULT 0.0)
例
実例を示します。
SELECT make_interval(1, 2, 3, 4, 5, 6, 7);
結果:
1 year 2 mons 25 days 05:06:07
この例では、7つの引数すべてを提供しました。
これは、PostgreSQLの関数に引数を渡すための従来のメカニズムであり、「位取り記数法」と呼ばれます。
位置表記を使用する場合、すべての引数が順番に指定されます。
名前付き表記
名前付き表記を使用した例を次に示します。
SELECT make_interval(days => 12);
結果:
12 days
この例では、引数を1つだけ指定するために、名前付き表記を使用しています。これにより、日数を指定するだけで、すべての引数を入力する必要がなくなります。
すべての引数はデフォルトでゼロに設定されているため、省略しても悪影響はありません。
引数を1つだけ指定するときに名前付き表記を使用しないと、次のようになります。
SELECT make_interval(12);
結果:
12 years
私は12年を意味すると仮定しました。
名前付き表記の良いところは、必要な数の引数を指定でき、それ以上は指定できないことです。
例:
SELECT make_interval(months => 10, days => 5, mins => 47);
結果:
10 mons 5 days 00:47:00
レガシー名前付き表記
古いバージョンのPostgresは、名前付き表記にわずかに異なる構文を使用していました。この構文は:=
を使用します =>
の代わりに 。
例:
SELECT make_interval(days := 12);
結果:
12 days
Postgres 12の時点でも、この構文は下位互換性のために機能します。
週と日
Postgres間隔では、週は日として表されます。したがって、weeks
を指定すると 引数、結果は数日で表示されます。
SELECT make_interval(weeks => 2);
結果:
14 days
したがって、days
も指定すると 引数、それはweeks
によって生成された日に追加されます 引数。
SELECT make_interval(weeks => 2, days => 3);
結果:
17 days
インターバル出力スタイル
Postgresでは、間隔タイプの出力形式を次の4つの間隔スタイルのいずれかに設定できます。
-
sql_standard
-
postgres
-
postgres_verbose
-
iso_8601
これは、SET intervalstyle
を使用して設定できます 。デフォルトはpostgres
フォーマット。
前の例はすべてデフォルトの形式(postgres
)を使用しています 。
make_interval()
の出力を示す例を次に示します。 異なる出力スタイルを使用する場合。
sql_standard
SET intervalstyle = 'sql_standard';
SELECT make_interval(1, 2, 3, 4, 5, 6, 7);
結果:
+1-2 +25 +5:06:07
postgres
これがデフォルト設定です。
SET intervalstyle = 'postgres';
SELECT make_interval(1, 2, 3, 4, 5, 6, 7);
結果:
1年2ヶ月25日05:06:07
postgres_verbose
SET intervalstyle = 'postgres_verbose';
SELECT make_interval(1, 2, 3, 4, 5, 6, 7);
結果:
@ 1 year 2 mons 25 days 5 hours 6 mins 7 secs
iso_8601
SET intervalstyle = 'iso_8601';
SELECT make_interval(1, 2, 3, 4, 5, 6, 7);
結果:
P1Y2M25DT5H6M7S