TIME_BUCKET (日時)
timebucket_optional_clause::=
目的
指定した時間隔の日時を取得するには、TIME_BUCKET
(日時)を使用します。
TIME_BUCKET
には、3つの必須引数と2つのオプション引数があります。
-
最初の引数
datetime
は、バケットへの入力です。3番目の引数
origin
は、すべてのバケットが位置合せされるアンカーです。datetime
とorigin
には、DATE
、TIMESTAMP
、TIMESTAMP WITH TIMEZONE
、TIMESTAMP WITH LOCAL TIMEZONE
、EPOCH TIME
、BINARY_FLOAT
、BINARY_DOUBLE
、CHAR
、式またはバインド変数を指定できます。EPOCH TIME
は、Oracle型NUMBER
で表されます。これは、UTCでの1970年1月1日00:00:00以降の経過秒数です。EPOCH TIME
のサポート対象範囲は、SB8MINVAL
(- 9223372036854775808
、すべて含まれる)からSB8MAXVAL
(9223372036854775807
、すべて含まれる)までです。datetime
とorigin
の場合は、暗黙的な変換があります。-
それが
BINARY_FLOAT
またはBINARY_DOUBLE
である場合は、暗黙的にNUMBER
に変換されます。暗黙的な変換による精度の損失を考慮する必要があることに注意してください。 -
それが
CHAR
である場合は、暗黙的にTIMESTAMP
に変換されます。なお、CHAR
はセッションNLS_TIMESTAMP_FORMAT
と一致している必要があります。そうでない場合は、エラーが発生します。
小数秒は、
datetime
とorigin
がEPOCH TIME
、BINARY_FLOAT
またはBINARY_DOUBLE
である場合のみサポートされます。datetime
とorigin
の有効範囲は、-4712-01-01 00:00:00
から9999-12-31 23:59:59:00
まで(境界値を含む)です。 -
-
2番目の引数
stride
は、正のOracleINTERVAL
、ISO 8601の時間間隔文字列、式またはバインド変数です。小数秒は、datetime
とorigin
がEPOCH TIME
、BINARY_FLOAT
またはBINARY_DOUBLE
である場合のみサポートされます。Oracleの
INTERVAL
での有効な間隔は、INTERVAL YEAR TO MONTH
とINTERVAL DAY TO SECOND
という2種類です。年または月を指定した場合、その他の単位は、指定されていてもすべて無視されます。ISO 8601の時間間隔文字列の場合、years、months、days、hours、minutesおよびsecondsは、
0
と999999999
の間の整数です。frac_secs
は、.0
と.999999999
の間の、秒の小数部です。指定したISO 8601時間間隔文字列が、Oracleの
INTERVAL
の定義と一致している必要があります。P
は必須であり、この値に空白は使用できません。T
を指定した場合は、hours
、minutes
またはseconds
を少なくとも1つ指定する必要があります。hours
は24時間に基づいています。たとえば、
P100DT05H
は100日と5時間を示しています。P1Y2M
は、1年と2か月を示しています。P1M1DT5H30M30S
は、P1M
(1か月を示している)と同等です。ISO 8601の時間間隔文字列の構文:
stride
には正の値のみを使用してください。(OracleのINTERVAL
およびISO 8601の時間間隔文字列は正または負にできます。)datetime
またはorigin
がEPOCH TIME
、BINARY_FLOAT
またはBINARY_DOUBLE
である場合、stride
にYEAR
やMONTH
を含めることはできません。これは、monthが可変であり、28
、29
、30
または31
のいずれかになる可能性があるためです。 -
4番目の引数はオプションであり、時間バケットの開始値または終了値が返されるようにするかどうかを指定します。時間バケットの開始値を返すには
START
を、終了値を返すにはEND
を指定します。この値では大文字と小文字が区別されません。デフォルト値はSTART
です。 -
5番目の引数はオプションであり、バケット(ストライド)の決定方法を制御します。
ON OVERFLOW ROUND
(デフォルト): バケットは、対応する月のorigin
と同じ日に切り出されます。その日がない月の場合、バケットは、月の最終日に丸められます。ON OVERFLOW ERROR
: バケットは、対応する月のorigin
と同じ日に切り出されます。その日がない月の場合、エラーになります。LAST DAY OF MONTH
:origin
が月の最終日で、stride
にMONTH
またはYEAR
(あるいはその両方)のみが含まれている場合、バケットは対応する月の最終日に切り出されます。たとえば、
origin
が'1991-11-30'
であり、stride
が'P1M'
である場合は:-
ON OVERFLOW ROUND
の場合、各バケットの開始は次のようになります:..., 1991-11-30, 1991-12-30, 1992-01-30, 1992-02-29, 1992-03-30, 1992-04-30,...
-
For
ON OVERFLOW ERROR
の場合、各バケットの開始は次のようになります:..., 1991-11-30, 1991-12-30, 1992-01-30, error (or 1992-02-30), 1992-03-30, 1992-04-30,...
-
LAST DAY OF MONTH
の場合、各バケットの開始は次のようになります:..., 1991-11-30, 1991-12-31, 1992-01-31, 1992-02-29, 1992-03-31, 1992-04-30, ...
-
ルール
-
各バケットの終了値は、次のバケットの開始値と同じです。たとえば、バケットが2年で、スライスの開始値が
2000-01-01
である場合、バケットの終了値は、2001-12-31
ではなく2002-01- 01
になります。つまり、バケットには、開始値以降と終了値以前(終了値と等しくない)のdatetime
が含まれます。 -
一般に、バケットの
START
は、常にバケットのEND
以前です。ただし、バケットの、有効時間範囲の両側で、START
がEND
と等しくなる可能性はあります。 -
origin
とdatetime
は、有効範囲内であるかぎり正にも負にもできます。origin
またはdatetime
が有効範囲外の場合、あるいは戻り値が有効範囲外の場合、エラーが発生します。 -
入力値の型が
TIMESTAMP WITH TIME ZONE
またはTIMESTAMP WITH LOCAL TIME ZONE
である場合は、時間バケットが夏時間の境界をまたいでいることがあります。この場合、その時間バケットの期間は、他の時間バケットと同じになります。 -
origin
とdatetime
がTIMESTAMP WITH TIME ZONE
またはTIMESTAMP WITH LOCAL TIME ZONE
である場合、すべての算術計算はUTC時間に基づきます。
例
次の例では、NLS_DATE_FORMAT
でYYYY-MM-DD
を使用します。ALTER SESSION
を使用して日付書式を設定します。
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';
例1
SELECT TIME_BUCKET (DATE ‘2022-06-29’, INTERVAL ‘5’ YEAR, DATE ‘2000-01-01’, START);
結果は次のとおりです。
2020-01-01
2022-06-29
を含む5年の時間バケットは、2020-01-01
(開始)から2025- 01-01
(終了)までです。4番目の引数START
が使用されているため、時間バケットの開始値2020-01-01
が返されます。
例2
次の2つの問合せは同等です:
SELECT TIME_BUCKET ( DATE ‘-2022-06-29’, ‘P5M’, DATE ‘-2022-01-01’, END );
または:
SELECT TIME_BUCKET ( DATE ‘-2022-06-29’, INTERVAL ‘5’ MONTH, DATE ‘-2022-01-01’, END);
結果は次のとおりです。
-2022-11-01
-2022-06-29
を含む5か月の時間バケットは、2022-06-01
(開始)から-2022- 11-01
(終了)までです。4番目の引数END
が使用されているため、時間バケットの終了値2022-11-01
が返されます。
例3
SELECT TIME_BUCKET ( DATE ‘2005-03-10’, 'P1Y', DATE ‘2004-02-29’ ON OVERFLOW ERROR );
結果は次のとおりです。
ORA-01839: date not valid for month specified
'2005-03-10'
を含む1年の時間バケットは、エラー('2005-02-29'
) (開始)からエラー('2006-02-29'
) (終了)までです。デフォルトの4番目の引数START
が使用されているため、時間バケットの開始(エラー)が返されます。
SELECT TIME_BUCKET ( DATE ‘2005-03-10’, 'P1Y', DATE ‘2004-02-29’ ON OVERFLOW ROUND );
結果は次のとおりです。
2005-02-28
'2005-03-10'
を含む1年の時間バケットは、2月29日が2月28日に丸められるため、'2005-02-28'
(開始)から'2006- 02-28'
(終了)までです。デフォルトの4番目の引数START
が使用されているため、時間バケットの開始('2005-02-28'
)が返されます。
例5
SELECT TIME_BUCKET ( DATE ‘2004-04-02’, ‘P1Y’, DATE ‘2003-02-28’ LAST DAY OF MONTH );
結果は次のとおりです。
2004-02-29
'2003-02-28'
を含む1年の時間バケットは、'2004-02-28'
がその月の最終日('2004-02-29'
)に丸められるため、'2004-02-29'
(開始)から'2005- 02-28'
(終了)までです。デフォルトの4番目の引数START
が使用されているため、時間バケットの開始値'2004-02- 29'
が返されます。