間隔のデータ型とリテラル
間隔のデータ型を使用して、seconds
、minutes
、hours
、days
、months
、years
などの単位で期間を保存できます。間隔のデータ型とリテラルは、日付とタイムスタンプへの間隔の追加、間隔の合計、日付またはタイムスタンプからの間隔の減算など、日時の計算に使用できます。間隔リテラルは、テーブル内の間隔データ型列への入力値として使用できます。
間隔データ型の構文
期間を年数と月数で保存する間隔データ型を指定するには:
INTERVAL year_to_month_qualifier
期間を日数、時間数、分数、および秒数で保存する間隔データ型を指定するには:
INTERVAL day_to_second_qualifier [ (fractional_precision) ]
間隔リテラルの構文
間隔リテラルを指定して、期間を年数と月数で定義するには:
INTERVAL quoted-string year_to_month_qualifier
間隔リテラルを指定して、期間を日数、時間数、分数、および秒数で定義するには:
INTERVAL quoted-string day_to_second_qualifier [ (fractional_precision) ]
引数
- quoted-string
-
数量と日時単位を入力文字列として指定する正または負の数値を指定します。quoted-string に数値のみが含まれている場合、Amazon Redshift は year_to_month_qualifier または day_to_second_qualifier から単位を決定します。例えば、
'23' MONTH
は1 year 11 months
、'-2' DAY
は-2 days 0 hours 0 minutes 0.0 seconds
、'1-2' MONTH
は1 year 2 months
、'13 day 1 hour 1 minute 1.123 seconds' SECOND
は13 days 1 hour 1 minute 1.123 seconds
を表します。間隔の出力形式の詳細については、「間隔スタイル」を参照してください。 - year_to_month_qualifier
-
間隔の範囲を指定します。修飾子を使用して、修飾子よりも小さい時間単位で間隔を作成すると、Amazon Redshift ではそれより小さい間隔の単位を切り捨てて破棄します。year_to_month_qualifier の有効な値は次のとおりです。
YEAR
MONTH
YEAR TO MONTH
- day_to_second_qualifier
-
間隔の範囲を指定します。修飾子を使用して、修飾子よりも小さい時間単位で間隔を作成すると、Amazon Redshift ではそれより小さい間隔の単位を切り捨てて破棄します。day_to_second_qualifier の有効な値は次のとおりです。
DAY
HOUR
MINUTE
SECOND
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND
INTERVAL リテラルの出力は、指定された最小の INTERVAL コンポーネントで切り捨てられます。例えば、MINUTE 修飾子を使用すると、Amazon Redshift は MINUTE より小さい時間単位を破棄します。
select INTERVAL '1 day 1 hour 1 minute 1.123 seconds' MINUTE
結果の値は
'1 day 01:01:00'
で切り捨てられます。 - Fractional_precision
-
間隔で使用できる小数点以下の桁数を指定するオプションのパラメータ。fractional_precision 引数は、間隔に SECOND が含まれている場合にのみ指定する必要があります。例えば、
SECOND(3)
は、1.234 秒など、小数点以下 3 桁のみを許可する間隔を作成します。小数点以下の最大桁数は 6 です。
セッション設定 interval_forbid_composite_literals
は、YEAR TO MONTH と DAY TO SECOND の両方のパートを使用して間隔を指定している場合に、エラーを返すかどうかを決定します。詳細については、「interval_forbid_composite_literals」を参照してください。
区間演算
間隔の値を他の日時値と一緒に使用して算術演算を実行できます。次の表は、使用可能な演算と、各演算の結果であるデータ型を示しています。
注記
date
と timestamp
の両方の結果を生成できる演算は、式に関連する最小時間単位に基づいて行われます。例えば、interval
を date
に追加すると、YEAR TO MONTH 間隔の場合、結果は date
になり、DAY TO SECOND 間隔の場合、結果はタイムスタンプになります。
最初のオペランドが interval
の演算は、指定された 2 番目のオペランドに対して次の結果を生成します。
演算子 | 日付 | Timestamp | 間隔 | 数値 |
---|---|---|---|---|
- | 該当なし | 該当なし | 間隔 | 該当なし |
+ | 日付 | 日付/タイムスタンプ | 間隔 | 該当なし |
* | 該当なし | 該当なし | 該当なし | 間隔 |
/ | 該当なし | 該当なし | 該当なし | 間隔 |
最初のオペランドが date
の演算は、指定された 2 番目のオペランドに対して次の結果を生成します。
演算子 | 日付 | Timestamp | 間隔 | 数値 |
---|---|---|---|---|
- | 数値 | 間隔 | 日付/タイムスタンプ | 日付 |
+ | 該当なし | 該当なし | 該当なし | 該当なし |
最初のオペランドが timestamp
の演算は、指定された 2 番目のオペランドに対して次の結果を生成します。
演算子 | 日付 | Timestamp | 間隔 | 数値 |
---|---|---|---|---|
- | 数値 | 間隔 | Timestamp | Timestamp |
+ | 該当なし | 該当なし | 該当なし | 該当なし |
間隔スタイル
SQL SET コマンドを使用すると、間隔値の出力表示形式を変更できます。SQL で間隔データ型を使用する場合は、テキストにキャストして、予想される間隔スタイル (YEAR TO MONTH::text
など) を確認します。IntervalStyle
値を設定するために使用できる値は、次のとおりです。
postgres
— PostgreSQL スタイルに従います。これがデフォルトです。postgres_verbose
— PostgreSQL の詳細スタイルに従います。sql_standard
— SQL 標準間隔リテラルスタイルに従います。
次のコマンドは、間隔スタイルを sql_standard
に設定します。
SET IntervalStyle to 'sql_standard';
postgres 出力形式
postgres
間隔スタイルの出力形式は、次のとおりです。各数値は負の値にすることができます。
'<numeric> <unit> [, <numeric> <unit> ...]'
select INTERVAL '1-2' YEAR TO MONTH::text
varchar --------------- 1 year 2 mons
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text
varchar ------------------ 1 day 02:03:04.5678
postgres_verbose 出力形式
postgres_verbose 構文は postgres と似ていますが、postgres_verbose 出力には時間の単位も含まれています。
'[@] <numeric> <unit> [, <numeric> <unit> ...] [direction]'
select INTERVAL '1-2' YEAR TO MONTH::text
varchar ----------------- @ 1 year 2 mons
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text
varchar --------------------------- @ 1 day 2 hours 3 mins 4.56 secs
sql_standard 出力形式
間隔値 year to month は次のようにフォーマットされます。間隔の前にマイナス記号を指定すると、間隔が負の値になり、間隔全体に適用されます。
'[-]yy-mm'
間隔値 day to second は次のようにフォーマットされます。
'[-]dd hh:mm:ss.ffffff'
SELECT INTERVAL '1-2' YEAR TO MONTH::text
varchar ------- 1-2
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text
varchar --------------- 1 2:03:04.5678
間隔データ型の例
以下の例は、テーブルでの INTERVAL データ型の使用方法を示しています。
create table sample_intervals (y2m interval month, h2m interval hour to minute); insert into sample_intervals values (interval '20' month, interval '2 days 1:1:1.123456' day to second); select y2m::text, h2m::text from sample_intervals;
y2m | h2m ---------------+----------------- 1 year 8 mons | 2 days 01:01:00
update sample_intervals set y2m = interval '2' year where y2m = interval '1-8' year to month; select * from sample_intervals;
y2m | h2m ---------+----------------- 2 years | 2 days 01:01:00
delete from sample_intervals where h2m = interval '2 1:1:0' day to second; select * from sample_intervals;
y2m | h2m -----+-----
間隔リテラルの例
以下の例は、間隔スタイルを postgres
に設定して実行します。
次の例は、1 年の INTERVAL リテラルを作成する方法を示しています。
select INTERVAL '1' YEAR
intervaly2m --------------- 1 years 0 mons
修飾子を超える quoted-string を指定すると、残りの時間単位が間隔から切り捨てられます。次の例では、13 か月の間隔は 1 年と 1 か月になりますが、YEAR 修飾子により残りの 1 か月が除外されます。
select INTERVAL '13 months' YEAR
intervaly2m --------------- 1 years 0 mons
間隔文字列を下回る修飾子を使用すると、残った単位が含まれます。
select INTERVAL '13 months' MONTH
intervaly2m --------------- 1 years 1 mons
間隔で精度を指定すると、小数桁数が指定された精度まで切り捨てられます。
select INTERVAL '1.234567' SECOND (3)
intervald2s -------------------------------- 0 days 0 hours 0 mins 1.235 secs
精度を指定しない場合は、Amazon Redshift では最大精度 6 が使用されます。
select INTERVAL '1.23456789' SECOND
intervald2s ----------------------------------- 0 days 0 hours 0 mins 1.234567 secs
次の例では、範囲指定した間隔を作成する方法を示します。
select INTERVAL '2:2' MINUTE TO SECOND
intervald2s ------------------------------ 0 days 0 hours 2 mins 2.0 secs
修飾子は、指定する単位を指定します。例えば、次の例では前の例と同じ quoted-string (2:2) を使用していますが、Amazon Redshift では、修飾子に基づいて異なる時間単位を使用していると認識します。
select INTERVAL '2:2' HOUR TO MINUTE
intervald2s ------------------------------ 0 days 2 hours 2 mins 0.0 secs
各単位の略語と複数形もサポートされています。例えば、5s
、5 second
、5 seconds
は同じ間隔です。サポートされている単位は、年、月、日、時間、分、秒です。
select INTERVAL '5s' SECOND
intervald2s ------------------------------ 0 days 0 hours 0 mins 5.0 secs
select INTERVAL '5 HOURS' HOUR
intervald2s ------------------------------ 0 days 5 hours 0 mins 0.0 secs
select INTERVAL '5 h' HOUR
intervald2s ------------------------------ 0 days 5 hours 0 mins 0.0 secs