日付、タイムスタンプ、間隔のデータ型

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 (非推奨)

タイムゾーン変換されるタイムスタンプ。 TIMESTAMPTZ に似ていますが、ミリ秒精度しか備えていないため、動作は ANSI SQL に完全準拠ではありません。今後は使用しないでください。互換性のために維持されています。

なし

Virtual DataPort は、下位互換性を保持するために Version 7 の DATE 型を維持しています。ただし、将来のメジャーバージョンで削除する予定であるため、新たな開発では使用しないでください。この型は、Oracle の TIMESTAMP WITH LOCAL TIMEZONE 型に似ています。このデータ型は、特にクライアントアプリケーションやデータソースが Denodo サーバーと異なるタイムゾーンで稼働している場合に、現時点で取り扱うと非常に複雑になるため、非推奨となっています。

日時型を扱うクエリを作成するためのルール

以下のサブセクションでは、日時フィールドを伴うクエリを実行する場合に、従う必要のあるルールのリストを記載しています。

日時値を定義するための最適なメソッド

日時リテラルを作成するには、2 つのオプションがあります。

  1. 型の名前に続けて特定の形式で値を表す、標準の構文の使用。

  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

CAST(CURRENT_TIMESTAMP AS TIME WITHOUT TIME ZONE)

timestamp

LOCALTIMESTAMP または LOCALTIMESTAMP()

timestamptz

NOW() または CURRENT_TIMESTAMP

date (非推奨)

NOW()

LOCALTIMESTAMP は 8.0u20200201 で導入されました。Denodo 8.0 GA (更新プログラムは含まれない) を使用している場合は、代わりに CAST(CURRENT_TIMESTAMP AS TIMESTAMP WITHOUT TIME ZONE) を実行します。

日時値の別の日時値への変換

ある型の日時値を別の型の日時値に変換することができます。以下の表は、異なる日時データ型の間で指定可能な変換を示しています。

日時データ型の変換

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 つの型があります。

  1. intervalyearmonth: YEAR フィールドと MONTH フィールドの両方または一方を含む精度の継続期間。

    -- 145 years
    INTERVAL '145' YEAR
    
    -- 145 years and 11 months
    INTERVAL '145-11' YEAR TO MONTH
    
    -- 145 months
    INTERVAL '145' MONTH
    
  2. 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: milliseconds between <operand 1> and <operand 2>. The result is a positive number if <operand 1> is higher than <operand 2>. Otherwise, the result is a negative number.