すべてのTIMEおよびTIMESTAMPデータには、暗黙的または明示的に時間帯が関連付けられます。時間帯は、世界標準時(UTC)からの変位を符号付きで表現したものです。デフォルトでは、すべてのTIMEおよびTIMESTAMPの値は内部的にはUTCとして格納されます。しかし、TimeDateWZControl DBS制御フィールドを使用して、時間帯の情報がない日付/時刻値がシステム現地時間としてデータベース内に格納されるように指定することができます。詳細は、<Teradata Vantage™ - データベース ユーティリティ、B035-1102>の「DBS制御」を参照してください。
格納用に送信される時刻(TIME)値とTIMESTAMP値は、時間帯情報を含んだリテラルでもかまいませんし、送信される値に時間帯の変位情報を付け加える構文で明示的に指定することもできます。
時間帯情報の定義方法 | 结果 |
---|---|
暗黙的 | SQLセッションのデフォルトの時間帯変位が値に割り当てられる。 |
明示的 | 実行依頼された時間帯の変位が値と共に格納される。 |
セッションのタイムゾーンの定義方法の詳細は、<Teradata Vantage™ SQLデータ定義言語-構文規則および例、B035-1144>の「SET TIME ZONE」を参照してください。
UTC形式の値の格納と操作
デフォルトでTeradata Databaseは、すべての時刻(TIME)値とTIMESTAMP値をUTCに変換してから格納します。時刻(TIME)値とTIMESTAMP値に対するすべての処理(ハッシュ、照合、比較など)は、UTC形式で実行されます。
ハッシュを例に取って、以下のタイムスタンプ リテラルについて考えてみましょう。
TIMESTAMP '1999-07-01 15:00:00-08:00' TIMESTAMP '1999-07-01 18:00:00-05:00'
どちらの値も、UTCで次のように表わすと同じ時刻を指しています。
TIMESTAMP '1999-07-01 23:00:00'
いずれも同じ時刻なので、両方のリテラルが同じようにハッシュされます。
照合を例に取って、以下のTIME WITH TIME ZONEリテラルについて考えてみましょう。
TIME '08:00:00-08:00' TIME '12:00:00-08:00' TIME '15:00:00-08:00' TIME '20:00:00-08:00'
これらの値の正確な照合は、次のようになります。
TIME '20:00:00-08:00' TIME '08:00:00-08:00' TIME '12:00:00-08:00' TIME '15:00:00-08:00'
この結果は直感的に理解できるものではありませんが、値をUTCに変換してみると意味が明らかになります。
現地の時刻値 | UTCの時刻値 |
---|---|
TIME '08:00:00-08:00' | TIME '16:00:00' |
TIME '12:00:00-08:00' | TIME '20:00:00' |
TIME '15:00:00-08:00' | TIME '23:00:00' |
TIME '20:00:00-08:00' | TIME '04:00:00' |
お分かりのとおり、TIME WITH TIME ZONEリテラルの 20:00:00-08:00 は、実際にはシーケンスの中の最低の値になっています。
しかし、この説明について言えば、 20:00:00-08:00 という時刻値は実際には翌日の 04:00:00 を指しているという反論もあるでしょう。これは確かに正しい考え方ですが、TIMEデータ型には日付調整の概念がありません。この特性があるために、この例のような結果が生じる可能性のある状況においては、TIMESTAMPデータ型の使用を検討してみてください。
この動作の詳しい例については、<Teradata Vantage™ SQLデータ操作言語、B035-1146>の「ORDER BY句」を参照してください。TIMEデータ型を使用して、列に対してORDER BY句を使用して行を抽出し、想定しない結果が返される例が記載されています。この例では、想定されている結果を得るために使用できる対処方法も記述されています。
暗黙時間帯割当て
TIMEデータまたはTIMESTAMPデータに明示的な時間帯が指定されていない場合は、デフォルトで現在のセッションの時間帯がデータに割り当てられます。
セッションの現在の時間帯は、UTCからの相対時間として定義されます。
例えば、米国の東部標準時(EST)はUTCよりも5時間前になるため、ESTは符号付きの値-05:00で示されます。東部夏時間(EDT)はUTCよりも4時間前になるため、EDTは符号付きの値-04:00で示されます。欧州時間はUTCよりも1時間進んでいるため、+01:00で表現されます。
TIMEまたはTIMESTAMP列の定義方法 | その時間帯の情報に対する処置 |
---|---|
WITH TIME ZONE | データに適用可能なオフセットを示すために、フィールドTIMEZONE_HOURおよびTIMEZONE_MINUTEを使用して明示的に格納される。 |
WITH TIME ZONEなし | データと共には格納されないため、データが格納された時点でどの時間帯が有効になっていたかを知ることができない。 |
UTCオフセットの時刻値の動作
UTCオフセットを使って時刻値を格納する場合の標準的な動作は、以下のとおりです。
PST時間帯で導入し、現在がローカル時間で1998-12-31 20:30であるとします。
その時刻のシステムTIMESTAMP WITH TIME ZONEは、内部において 1999-01-01 04:30-08:00 となります。
CURRENT_TIMESTAMP関数を実行すると、TIME ZONEを含む形式になり、外部表示は、指定された時間帯に適した値に変換します。
時間帯なしでこの値を返す必要がある場合は、CASTを使用して値をTIMESTAMP(TIME ZONEなし)に変換することができます。PSTの場合、結果は'1999-12-31 20:30'となりますが、ESTのタイムゾーン オフセットを使用して実行された同じクエリーは、'1999-12-31 23:30'という結果を返します。
時間帯を調整すると、結果が表示されるときにYear、Month、およびDayフィールドの値が変わることがあることを認識しておく必要があります。
タイムスタンプがORDER BY句で比較または使用される場合、時間帯調整によって比較処理または並替え処理が影響されることはありません。
TIMESTAMPの場合と同様に、TIMEの時間帯を調整したときにも表示内容が変わることがあります。
時間帯の加算または減算の影響で比較や順序が変わるのは、前の日(または次の日)との境目をマークする順序フィールドがHOURフィールドの上位にない場合です。
関連トピック
詳細情報 | 参照先 |
---|---|
セッションのタイムゾーンの設定 | Teradata Vantage™ SQLデータ定義言語-構文規則および例、B035-1144の"SET TIME ZONE"、"CREATE USER"、"MODIFY USER" |
システムのタイムゾーンの設定について | Teradata Vantage™ - データベースの管理、B035-1093。 |
AT LOCALおよびAT TIME ZONEタイムゾーン指定子を使用して、日時式でタイムゾーンの変位を指定することについて | <Teradata Vantage™ SQL関数、式、および述部、B035-1145>の「ANSIの日時式」。 |
夏時間を考慮に入れたシステム時間の自動調整 | <Teradata Vantage™ - データベース ユーティリティ、B035-1102>の「SDFファイル」および「Teradata Locale Definitionユーティリティ(tdlocaledef)」。 |
|
<Teradata Vantage™ - データベース ユーティリティ、B035-1102>のTimeDateWZControl DBS制御フィールドです。 |