日付、タイムスタンプ、間隔のデータ型¶
Virtual DataPort には、日時値と間隔値を保持するためのデータ型があります。以下の表を参照してください。
Denodo の型の名前 |
説明 |
SQL 標準の型の名前 |
---|---|---|
LOCALDATE |
タイムゾーンなしの日付 (年、月、日) |
DATE |
TIME |
タイムゾーンなしの時間 (時、分、秒、ナノ秒精度の秒の小数部) |
TIME WITHOUT TIME ZONE |
TIMESTAMP |
タイムゾーンなしのタイムスタンプ (年、月、日、時、分、秒、ナノ秒精度の秒の小数部) |
TIMESTAMP WITHOUT TIME ZONE |
TIMESTAMPTZ |
タイムゾーン変換されるタイムスタンプ |
TIMESTAMP WITH TIME ZONE |
INTERVALDAYSECOND |
YEAR または MONTH 以外の連続フィールドのうち、任意のセットを含む精度の継続期間 |
day-time intervals |
INTERVALYEARMONTH |
YEAR フィールドと MONTH フィールドの両方または一方を含む精度の継続期間 |
year-month intervals |
DATE (非推奨) |
タイムゾーン変換されるタイムスタンプ。 |
なし |
Virtual DataPort は、下位互換性を保持するために Version 7 の DATE 型を維持しています。ただし、将来のメジャーバージョンで削除する予定であるため、新たな開発では使用しないでください。この型は、Oracle の TIMESTAMP WITH LOCAL TIMEZONE 型に似ています。このデータ型は、特にクライアントアプリケーションやデータソースが Denodo サーバーと異なるタイムゾーンで稼働している場合に、現時点で取り扱うと非常に複雑になるため、非推奨となっています。
注釈
日付パターン形式の詳細については、「 日付と時間のパターン文字列 」を参照してください。日付には、文字リテラルではなく、日付型リテラルを使用することをお勧めします。なぜなら、文字リテラルによる無効なパターンを使用すると、予期しない結果が生じる可能性があるからです。
日時型を扱うクエリを作成するためのルール¶
以下のサブセクションでは、日時フィールドを伴うクエリを実行する場合に、従う必要のあるルールのリストを記載しています。
日時値を定義するための最適なメソッド¶
日時リテラルを作成するには、2 つのオプションがあります。
型の名前に続けて特定の形式で値を表す、標準の構文の使用。
関数の使用。
どちらの方法でも同じ結果になります。
Denodo の型 |
この型の値の作成オプション |
例 |
---|---|---|
localdate |
リテラル |
DATE '2018-01-15'
|
関数 |
to_localdate('yyyy-MM-dd', '2018-01-15')
|
|
time |
リテラル |
TIME '21:45:59'
TIME '21:45:59.999'
|
関数 |
to_time('HH:mm:ss.SSS','21:45:59.999')
|
|
timestamp |
リテラル |
TIMESTAMP '2018-01-15 21:45:01'
TIMESTAMP '2018-01-15 21:45:01.256'
|
関数 |
to_timestamp(
'yyyy-MM-dd HH:mm:ss.SSS'
, '2018-01-15 21:45:01.256')
|
|
date (非推奨) |
timestamptz と同じです (下記を参照)。クライアントから見ると、どちらの型も同様に動作します。 |
|
timestamptz |
リテラル |
TIMESTAMP WITH TIME ZONE '2018-01-15 21:45:01 +02:00'
TIMESTAMP WITH TIME ZONE '2018-01-15 21:45:01.256
+02:00'
|
関数 |
to_timestamptz(
'yyyy-MM-dd HH:mm:ss.SSS XXX'
, '2018-01-15 21:45:01.256 +02:00')
|
|
interval_year_month |
リテラル |
INTERVAL '145' YEAR
INTERVAL '145-11' YEAR TO MONTH
|
関数 |
間隔を作成する関数はありません。 |
|
time |
リテラル |
INTERVAL '4 5:12:10.222' DAY TO SECOND
INTERVAL '4 5:12' DAY TO MINUTE
|
関数 |
間隔を作成する関数はありません。 |
適切な関数の使用による現在日時の取得¶
日時値と現時点の時間を比較するには、比較する型に応じて適切な関数を使用します。
データ型 |
現時点の取得に使用する関数 |
---|---|
localdate |
CURRENT_DATE() または CURRENT_DATE |
time |
LOCALTIME |
timestamp |
LOCALTIMESTAMP または LOCALTIMESTAMP() |
timestamptz |
CURRENT_TIMESTAMP または NOW() |
date (非推奨) |
NOW() |
日時値の別の日時値への変換¶
ある型の日時値を別の型の日時値に変換することができます。以下の表は、異なる日時データ型の間で指定可能な変換を示しています。
LOCALDATE へ |
TIME へ |
TIMESTAMP へ |
TIMESTAMPTZ へ |
|
---|---|---|---|---|
LOCALDATE から |
問題なし |
サポートなし |
年、月、日をコピーし、時、分、秒をゼロに設定 |
SV → TZ なし TS → TZ あり TS |
TIME から |
サポートなし |
問題なし |
CURRENT_DATE から日付フィールドを、SV から時間フィールドをコピー |
SV → TZ なし TS → TZ あり TS |
TIMESTAMP から |
SV から日付フィールドをコピー |
SV から時間フィールドをコピー |
問題なし |
TV.UTC = SV-STZD、TV.TZ = STZD |
TIMESTAMPTZ へ |
SV → TZ なし TS → LOCALDATE |
SV → TZ なし TS → TIME |
SV.UTC + SV.TZ |
問題なし |
SV: ソース値。
TV: ターゲット値。
UTC: SV または TV の UTC コンポーネント (ソースまたはターゲットにタイムゾーンがある場合、かつその場合に限る)。
TZ: SV または TV のタイムゾーン変換 (ソースまたはターゲットにタイムゾーンがある場合、かつその場合に限る)、STZD は SQL セッションのデフォルトのタイムゾーン変換です。
「→」 : 変換は複数の手順で概念的に実行されます。たとえば、「timestamptz」から「localdate」への変換は、「SV → TZ なし TS → LOCALDATE」となります。つまり、「timestamptz」値は「timestamp」に変換され、「timestamp」が「date」に変換されます。
ルール
CAST 関数を使用して明示的に実行する必要がある timestamptz との間の変換を除き、これらの変換はすべて必要に応じて暗黙的に実行されます。
timestamp から timestamptz に変換する場合、timestamptz 値に追加されるタイムゾーンは Denodo サーバーのロケールのタイムゾーンです。
例
2017-10-15 21:45:00 → 2017-10-15 21:45:00 +02:00
timestamp から timestamptz への変換。新しい値のタイムゾーンはサーバーのロケールです。
2017-01-15 21:15:00 → 2017-01-15
timestamp から date への変換。時間コンポーネントを削除します。
2017-10-15 21:45:01 → 21:45:01
timestamp から time への変換。日付コンポーネントを削除します。
2017-10-15 21:45:00 +05:00 → 2017-10-15 18:45:00
timestamptz から timestamp への変換。ソース値のタイムゾーン変換と Denodo サーバーのロケールのタイムゾーンの間の差を減算してローカルタイムスタンプに変換します。この例では、サーバーのタイムゾーンは +02:00 です。
2017-10-15 21:45:00 +05:00 → 2017-10-16
timestamptz から localdate への変換。最初に timestamp (2017-10-16 00:45:00) に変換してから、時間部分を削除します。この例では、サーバーのタイムゾーンは +08:00 です。この例では、ソース値の日がターゲット値の日と異なる点に注意してください。変換の最初の段階 (timestamptz から timestamp へ) で、時間がタイムゾーンの差に従って変更され、その結果、日付も変更される場合があるからです。
2017-10-15 21:45:00 +05:00 → 18:45:00
timestamptz から time への変換。最初に timestamp (2017-10-15 18:45:00) に変換してから日付部分を削除します。この例では、サーバーのタイムゾーンは +02:00 です。
2017-01-15 → 2017-01-15 00:00:00
localdate から timestamp への変換。時間コンポーネントを 0 にセットします。
2017-01-15 → 2017-01-15 00:00:00 +05:00
localdate から timestamptz への変換。最初に timestamp に変換してからサーバーのロケールのタイムゾーンを追加します。この例では、サーバーのタイムゾーンは +05:00 です。
21:45:01 → 2017-10-15 21:45:01
time から timestamp への変換。日付部分を Denodo サーバーの現在日付で埋めます。
21:45:00 → 2017-10-15 21:45:00 +02:00
time から timestamptz への変換。最初に timestamp (2017-10-15 21:45:00) に変換してからサーバーのロケールのタイムゾーンを追加します。この例では、サーバーのタイムゾーンは +02:00 です。
間隔のデータ型¶
期間を表す間隔には、2 つの型があります。
intervalyearmonth
: YEAR フィールドと MONTH フィールドの両方または一方を含む精度の継続期間。-- 145 years INTERVAL '145' YEAR -- 145 years and 11 months INTERVAL '145-11' YEAR TO MONTH -- 145 months INTERVAL '145' MONTH
intervaldaysecond
: YEAR または MONTH 以外の連続フィールドのうち、任意のセットを含む精度の継続期間。-- 4 days, 5 hours, 12 minutes, 10 seconds and 222 milliseconds INTERVAL '4 5:12:10.222' DAY TO SECOND -- 4 days, 5 hours and 12 minutes INTERVAL '4 5:12' DAY TO MINUTE -- 11 hours and 20 minutes INTERVAL '11:20' HOUR TO MINUTE -- 10 minutes and 22 seconds INTERVAL '10:22' MINUTE TO SECOND -- 30 seconds and 123 milliseconds INTERVAL '30.123' SECOND
2 つの間隔値は、それらが同じ間隔型の場合にのみ比較できます。
日時値と間隔値の算術演算子¶
算術演算子を使用して、datetime 型と INTERVAL 型の値に対して演算を実行できます。
オペランド 1 |
演算子 |
オペランド 2 |
結果の型 |
---|---|---|---|
Datetime |
- |
Datetime |
long *-1 |
Datetime |
+ または - |
Interval |
Datetime |
Time |
+ または - |
Time |
long *-2 |
Interval |
+ |
Datetime |
Datetime |
Interval |
+ または - |
Interval |
Interval |
Interval |
* または / |
int または long |
Interval |
int または long |
* |
Interval |
Interval |
*-1: <operand 1> と <operand 2> の間の日数。<operand 1> が <operand 2> より最近の日時の場合、結果は正の数です。それ以外の場合、結果は負の数です。
*-2: <operand 1> と <operand 2> の間のミリ秒数。<operand 1> が <operand 2> より値が大きい場合、結果は正の数です。それ以外の場合、結果は負の数です。