16.20 - $TD_TIMECODE_RANGE - Teradata Vantage NewSQL Engine

Teradata Vantage™ 時系列テーブルおよび操作

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1208-162K-JPN

$TD_TIMECODE_RANGEは、集約結果が計算される時間の範囲を指定する仮想システム列です。そのデータ型はperiod(timestamp(6) with time zone)です。タイムコード範囲列は、('2014-01-06 09:00:00.000000+00:00', '2014-01-06 09:30:00.000000+00:00')のような時間範囲を格納できます。これはSELECT句およびORDER BY句で使用できます。

列を取得して使用するには、SELECT句またはORDER BY句に$TD_TIMECODE_RANGEを入力します。
  • デフォルトのTITLEはTIMECODE_RANGEです。
  • ユーザーは、AS句でデフォルト タイトルの名前を変更することができます。
  • 列のデータ型は、Periodデータ型(PDT)です。
  • PDT名ラベルを使用するのと同じ方法で、$TD_TIMECODE_RANGE名ラベルを使用します。
    • 直接参照できます。
    • PDTに関連するFUNCTIONS ... BEGIN($TD_TIMECODE_RANGE)、END($TD_TIMECODE_RANGE)のいずれかを起動できます。
    • 任意の式(これを関数に渡すことを含む)で使用できます。
    • 他のPDT列と同様にORDER BY句で使用できます。

$TD_TIMECODE_RANGE値

返される値はPDTの規則に従います。そのため、指定された範囲に開始時間は含まれますが、終了時間は含まれません。特定のGROUP BY TIME間隔番号に関連する範囲の開始時間は次のとおりです。
  • 1つの範囲の場合: 開始時間は範囲の開始時間です。
  • ORで区切られた複数の範囲の場合: 開始時間は指定されたすべての範囲の中で最も早い開始時間です。

詳細については、GROUP BY TIME - タイム ゼロ値を参照してください。

次の例では、クエリーの一部として指定された1つだけの時間範囲があります。

SELECT ... WHERE TD_TIMECODE BETWEEN TIMESTAMP ’2016-10-01 08:00:00’ AND TIMESTAMP ’2016-10-01 09:00:00’ GROUP BY TIME(MINUTES(15))
説明
  • GROUP BY TIMEのタイム ゼロの値は2016-10-01 08:00:00です
  • GROUP BY TIMEの間隔番号は15です
  • GROUP BY TIMEの間隔期間はMINUTESです

詳細については、GROUP BY TIME - タイム ゼロ値を参照してください。

これにより、1、2、3、4という番号を持つ結果が生成されます。

GROUP BY TIME (MINUTES(15)) TIMECODE_RANGE
1 '2016-10-01 08:00:00', '2016-10-01 08:15:00'
2 '2016-10-01 08:15:00', '2016-10-01 08:30:00'
3 '2016-10-01 08:30:00', '2016-10-01 08:45:00'
4 '2016-10-01 08:45:00', '2016-10-01 09:00:00'

スニペットの例では、クエリーの一部として指定された複数の時間範囲を示しています。

SELECT ... WHERE TD_TIMECODE BETWEEN TIMESTAMP ’2016-10-01 08:00:00’ AND TIMESTAMP ’2016-10-01 09:00:00’
OR TIMECODE BETWEEN TIMESTAMP ’2016-10-01 12:15:00’ AND TIMESTAMP ’2016-10-01 13:30:00’
GROUP BY TIME(MINUTES(15))
それぞれの説明は次のとおりです(複数の範囲がある場合)。
  • GROUP BY TIMEのタイム ゼロの値は'2016-10-01 08:00:00'です(これが両方の範囲の中で最も早いタイム ゼロであるため)
  • GROUP BY TIMEの間隔番号は15です
  • GROUP BY TIMEの間隔番号の期間はMINUTESです

これにより、次の結果が生成されます。

GROUP BY TIME (MINUTES(15)) TIMECODE_RANGE
1 '2016-10-01 08:00:00', '2016-10-01 08:15:00'
2 '2016-10-01 08:15:00', '2016-10-01 08:30:00'
3 '2016-10-01 08:30:00', '2016-10-01 08:45:00'
4 '2016-10-01 08:45:00', '2016-10-01 09:00:00'
18 '2016-10-01 12:15:00', '2016-10-01 12:30:00'
19 '2016-10-01 12:30:00', '2016-10-01 12:45:00'
20 '2016-10-01 12:45:00', '2016-10-01 13:00:00'
21 '2016-10-01 13:00:00', '2016-10-01 13:15:00'
22 '2016-10-01 13:15:00', '2016-10-01 13:30:00'

$TD_TIMECODE_RANGE値とシステム タイム ゾーン設定

$TD_TIMECODE_RANGE値は、tdlocaledefユーティリティまたは次のDBS制御フィールドで指定されたシステム タイム ゾーン設定に基づいています。
  • 16. System TimeZone Hour
  • 17. System TimeZone Minute
  • 18. System TimeZone String
  • 57. TimeDateWZControl

次のテーブル、データ、DBS制御の設定について考えてみます。

CREATE TABLE ocean_buoy (BUOYID INTEGER, SALINITY INTEGER, TEMPERATURE INTEGER)
PRIMARY TIME INDEX (TIMESTAMP(6), DATE '2012-01-01', HOURS(1), COLUMNS(BUOYID), nonsequenced);

INSERT INTO ocean_buoy VALUES(TIMESTAMP '2014-01-06 08:00:00.000000', 0, 55, 10);
DBS制御フィールドのデフォルトのシステム タイム ゾーン設定:
  • 16. System TimeZone Hour = 0
  • 17. System TimeZone Minute = 0
  • 57. TimeDateWZControl = 2

以下の問合わせを実行します。

SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, AVG(temperature)
FROM ocean_buoy
GROUP BY TIME(HOURS(1)) ORDER BY 1;

返す結果:

TIMECODE_RANGE GROUP BY TIME(HOURS(1)) Average (TEMPERATURE)
('2014-01-06 08:00:00.000000+00:00', '2014-01-06 09:00:00.000000+00:00') 17673 10
DBS制御フィールドの設定が次の場合:
  • 16. System TimeZone Hour = 8
  • 17. System TimeZone Minute = 0
  • 57. TimeDateWZControl = 2

以下の問合わせを実行します。

SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, AVG(temperature)
FROM ocean_buoy
GROUP BY TIME(HOURS(1)) ORDER BY 1;

返す結果:

TIMECODE_RANGE GROUP BY TIME(HOURS(1)) Average (TEMPERATURE)
('2014-01-06 16:00:00.000000+08:00', '2014-01-06 17:00:00.000000+08:00') 17673 10
DBS制御フィールドの設定が次の場合:
  • 16. System TimeZone Hour = 5
  • 17. System TimeZone Minute = 0
  • 57. TimeDateWZControl = 3

以下の問合わせを実行します。

SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, AVG(temperature)
FROM ocean_buoy
GROUP BY TIME(HOURS(1)) ORDER BY 1;

返す結果:

TIMECODE_RANGE GROUP BY TIME(HOURS(1)) Average (TEMPERATURE)
('2014-01-06 08:00:00.000000+05:00', '2014-01-06 09:00:00.000000+05:00') 17668 10
この例では、tdlocaledefユーティリティを使用してTimeZoneStringを"America Pacific"に設定し、次のクエリーを実行します。
SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, AVG(temperature)
FROM ocean_buoy
GROUP BY TIME(HOURS(1)) ORDER BY 1;

返す結果:

TIMECODE_RANGE GROUP BY TIME(HOURS(1))
('2014-01-06 00:00:00.000000-08:00', '2014-01-06 01:00:00.000000-08:00') 17673

不規則の$TD_TIMECODE_RANGE値

ある範囲のタイムバケットが、(指定された期間に基づいて)タイムバケット全体を完了しないように指定されている場合、この例に示されるように、生成される$TD_TIMECODE_RANGE値はこの不一致を反映します。

SELECT $TD_TIMECODE_RANGE, $TD_GROUP_BY_TIME, BUOYID, AVG(TEMPERATURE), COUNT(*)
FROM OCEAN_BUOYS
WHERE TD_TIMECODE BETWEEN TIMESTAMP '2014-01-06 08:00:00' AND TIMESTAMP '2014-01-06 08:30:00' OR
TD_TIMECODE BETWEEN TIMESTAMP '2014-01-06 10:02:00' AND TIMESTAMP '2014-01-06 10:15:00'
GROUP BY TIME (MINUTES(10) AND BUOYID)
ORDER BY 2, 3;

結果:

TIMECODE_RANGE GROUP BY TIME (MINUTES(10)) BUOYID Average (TEMPERATURE) Count(*)
('2014-01-06 08:00:00.000000+00:00', '2014-01-06 08:10:00.000000+00:00') 1 0 54 3
('2014-01-06 08:10:00.000000+00:00', '2014-01-06 08:20:00.000000+00:00') 2 0 55 2
('2014-01-06 10:02:00.000000+00:00', '2014-01-06 10:10:00.000000+00:00') 13 44 54.25 4
('2014-01-06 10:10:00.000000+00:00', '2014-01-06 10:15:00.000000+00:00') 14 44 43 1