- カテゴリ:
TIME_SLICE¶
時間の「スライス」の開始または終了を計算します。ここでのスライスの長さは標準的な時間単位(分、時間、日など)の倍数です。
この関数を使用して、データを分類できる固定幅の「バケット」の開始時間と終了時間を計算できます。
- こちらもご参照ください。
構文¶
TIME_SLICE( <date_or_time_expr> , <slice_length> , <date_or_time_part> [ , <start_or_end> ] )
引数¶
必須:
date_or_time_expr
この関数は、この日付または時刻を含むスライスの開始または終了を返します。式は DATE または TIMESTAMP_NTZ型でなければなりません。
slice_length
これは、スライスの幅(つまり、スライスに含まれる時間単位)を示します。たとえば、単位が MONTH で、
slice_length
が2の場合、各スライスの幅は2か月です。slice_length
は、1以上の整数にする必要があります。date_or_time_part
スライス長の時間単位です。値は、以下にリストされた値のいずれかを含む文字列でなければなりません。
入力式が DATE の場合: YEAR、 QUARTER、 MONTH、 WEEK、 DAY。
入力式が TIMESTAMP_NTZ の場合: YEAR、 QUARTER、 MONTH、 WEEK、 DAY、 HOUR、 MINUTE、 SECOND。
値は大文字と小文字を区別しません。
オプション:
start_or_end
これは、スライスの開始または終了を返すかどうかを決定するオプションの定数パラメーターです。
サポートされる値は「START」または「END」です。値は大文字と小文字を区別しません。
デフォルト値は「START」です。
戻り値¶
戻り値のデータ型は、入力 date_or_time_expr
(つまり、 TIMESTAMP_NTZ または DATE のいずれか)のデータ型と同じです。
使用上の注意¶
すべてのスライスは、1970年1月1日午前0時(1970-01-01 00:00:00)を基準にして整列されます。
ほとんどのスライスは、1970年1月1日を基準としたスライス長の整数倍で始まります。たとえば、15年のスライス長を選択した場合、各スライスは次のいずれかの境界で始まります。
1970年1月1日。
1985年1月1日。
2000年1月1日。
2015年1月1日。
その他
1970年1月1日より前の日付も有効です。たとえば、15年のスライスは1955年1月1日から開始できます。
1つの例外は、週単位で測定されたスライスの場合、スライスの開始が1970年1月1日を含む 週 の開始に揃えられることです。1970年1月1日は木曜日でした。したがって、例として WEEK_START セッションパラメーターでカレンダーの週が月曜日から始まることを指定し、スライスが2週の場合、スライスは次のいずれかの境界から始まります。
1969年12月29日(月曜日)。
1970年1月12日(月曜日)。
1970年1月25日(月曜日)。
その他
カレンダーの週が日曜日から始まる場合、スライスは次から始まります。
1969年12月28日(日曜日)。
1970年1月11日(日曜日)。
1970年1月25日(日曜日)。
その他
例を含む、カレンダーの週の処理方法の詳細については、 カレンダーの週と平日 をご参照ください。
TIME_SLICE へのパラメーターは DATE または TIMESTAMP_NTZ 型でなければなりませんが、キャストを使用して TIMESTAMP_LTZ 値を処理できます。TIMESTAMP_LTZ 値の場合、入力を最初に TIMESTAMP_NTZ にキャストし、次に TIMESTAMP_LTZ にキャストし直します。ただし、この場合、夏時間の境界を越えるスライスは、夏時間の境界を越えないスライスよりも1時間長く、または1時間短くすることができます。
各スライスの終わりは、次のスライスの始まりと同じです。例えば、スライスが2か月で、スライスの開始が2019-01-01の場合、スライスの終了は2019-03-01になります。2019-02-28ではありません。つまり、スライスには、開始日以上で終了日未満(以下ではない)の日付またはタイムスタンプが含まれます。
例¶
ある日付を含む4ヶ月のスライスの開始と終了を見つけます。
SELECT '2019-02-28'::DATE AS "DATE", TIME_SLICE("DATE", 4, 'MONTH', 'START') AS "START OF SLICE", TIME_SLICE("DATE", 4, 'MONTH', 'END') AS "END OF SLICE"; +------------+----------------+--------------+ | DATE | START OF SLICE | END OF SLICE | |------------+----------------+--------------| | 2019-02-28 | 2019-01-01 | 2019-05-01 | +------------+----------------+--------------+
2つのタイムスタンプに対応する8時間スライスの開始を見つけます。
SELECT '2019-02-28T01:23:45.678'::TIMESTAMP_NTZ AS "TIMESTAMP 1", '2019-02-28T12:34:56.789'::TIMESTAMP_NTZ AS "TIMESTAMP 2", TIME_SLICE("TIMESTAMP 1", 8, 'HOUR') AS "SLICE FOR TIMESTAMP 1", TIME_SLICE("TIMESTAMP 2", 8, 'HOUR') AS "SLICE FOR TIMESTAMP 2"; +-------------------------+-------------------------+-------------------------+-------------------------+ | TIMESTAMP 1 | TIMESTAMP 2 | SLICE FOR TIMESTAMP 1 | SLICE FOR TIMESTAMP 2 | |-------------------------+-------------------------+-------------------------+-------------------------| | 2019-02-28 01:23:45.678 | 2019-02-28 12:34:56.789 | 2019-02-28 00:00:00.000 | 2019-02-28 08:00:00.000 | +-------------------------+-------------------------+-------------------------+-------------------------+
日付またはタイムスタンプに基づいてデータを「バケット」にグループ化します(例えば、データを2週間のバケットにグループ化します)
この例では、以下で作成されたテーブルとデータを使用します。
CREATE TABLE accounts (ID INT, billing_date DATE, balance_due NUMBER(11, 2)); INSERT INTO accounts (ID, billing_date, balance_due) VALUES (1, '2018-07-31', 100.00), (2, '2018-08-01', 200.00), (3, '2018-08-25', 400.00);このクエリはバケット化されたデータを表示します。
SELECT TIME_SLICE(billing_date, 2, 'WEEK', 'START') AS "START OF SLICE", TIME_SLICE(billing_date, 2, 'WEEK', 'END') AS "END OF SLICE", COUNT(*) AS "NUMBER OF LATE BILLS", SUM(balance_due) AS "SUM OF MONEY OWED" FROM accounts WHERE balance_due > 0 -- bill hasn't yet been paid GROUP BY "START OF SLICE", "END OF SLICE"; +----------------+--------------+----------------------+-------------------+ | START OF SLICE | END OF SLICE | NUMBER OF LATE BILLS | SUM OF MONEY OWED | |----------------+--------------+----------------------+-------------------| | 2018-07-23 | 2018-08-06 | 2 | 300.00 | | 2018-08-20 | 2018-09-03 | 1 | 400.00 | +----------------+--------------+----------------------+-------------------+GROUP BY 句にはスライスの開始とスライスの終了の両方が必要です。コンパイラは GROUP BY 句に射影句のすべての非集約式が含まれることを期待しているためです。