ヘッダーをスキップ
Oracle TimesTen In-Memory Database SQLリファレンス・ガイド
リリース7.0
E05176-03
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

TimesTenの時間隔

INTERVAL型の使用

TimesTen型モードを使用している場合、INTERVALの詳細は、TimesTenの以前のリリースのドキュメントを参照してください。

TimesTenの時間隔型は、定数で指定する場合と式の中間結果を表す場合でのみ使用できます。時間隔型を最終結果にすることはできません。列にINTERVAL型を定義することはできません。「データ型の仕様」を参照してください。

単一フィールドの時間隔リテラルを式に指定することはできますが、時間隔データ型を戻す完全な式は指定できません。

TimesTenでは、次の形式の時間隔リテラルがサポートされています。

INTERVAL [+\-] CharString IntervalQualifier

DATE型およびTIME型の使用

この項では、DATE、TIME、TIMESTAMPの各データ型の例を示します。

例1.16

DATEデータ型のDCOL列とTIMEデータ型のTCOL列の両方を含む、SAMPLEという名前の表を作成する構文は、次のとおりです。

CREATE TABLE SAMPLE (TCOL TIME, DCOL DATE);

例1.17

SAMPLE表にDATEとTIMEの値を挿入する構文は、次のとおりです。

INSERT INTO SAMPLE VALUES

(TIME '12:00:00', DATE '1998-10-28');

例1.18

SAMPLE表の、1998年10月29日の正午から午後4時までの行をすべて選択する構文は、次のとおりです。

SELECT * FROM SAMPLE WHERE DCOL = DATE '1998-10-29' AND

TCOL BETWEEN TIME '12:00:00' AND TIME '16:00:00';

例1.19

TIMESTAMPデータ型のTSCOL列を含む、SAMPLEという名前の表を作成して、1998年10月29日の正午から午後4時までの行をすべて選択するには、次の文を使用します。

CREATE TABLE SAMPLE2 (TSCOL TIMESTAMP);

INSERT INTO SAMPLE2 VALUES (TIMESTAMP '1998-10-28 12:00:00');

SELECT * FROM SAMPLE2

WHERE TSCOL

BETWEEN TIMESTAMP '1998-10-29 12:00:00'

AND '1998-10-29 16:00:00';


注意: TIME、DATE、TIMESTAMPデータ型については、リテラルと文字列の両方の書式を使用できます。たとえばTIMEの値は、TimeString('12:00:00')およびTimeLiteral(Time'16:00:00')の両方の書式で指定できます。TimesTenでは、最初の値をCHARとして読み取り、後で必要に応じてTIMEに変換します。2番目の値はTIMEとして読み取ります。前述の例では、リテラル書式を使用しています。マイクロ秒に満たない端数は、「Data truncated」エラーになります。

TIMEZONEの変換処理

現在、TIMEZONEはサポートされていません。TIME/TIMESTAMPデータ型の値は、時差を調整せずに保存されます。このためアプリケーションでは、値をデータベースに送信する前に特定のタイムゾーンを設定して、TIME/TIMESTAMPをそのタイムゾーンの時刻に変換する必要があります。たとえば、あるアプリケーションでTIMEZONEに太平洋標準時を設定している場合、太平洋夏時間または東部標準時のTIME/TIMESTAMPの値を使用するには、アプリケーションでTIME/TIMESTAMPを太平洋標準時に変換する必要があります。

算術演算における日時型および時間隔型

TimesTen型モードを使用している場合、算術演算での日時型および時間隔型の詳細は、TimesTenの以前のリリースのドキュメントを参照してください。

日時型は、DATE型、TIME型およびTIMESTAMP型を指します。日付および時刻の算術は、次の構文でサポートされています。

TimeVal1 - TimeVal2TimestampVal1 - TimestampVal2またはDateVal1 - DateVal2: 差をINTERVAL DAY TO SECONDで戻します。

TT_DateVal1 - TT_DateVal2 : 日数の差を整数として戻します。

DateTimeVal {+|-} IntervalVal

IntervalVal + DateTimeVal

IntervalVal1 {+|-} IntervalVal2

IntervalVal {*|/} NumericVal または

NumericVal * IntervalVal

INTERVAL型は、完結した式の最終結果には使用できません。この時間隔の結果から必要な要素を抽出するには、EXTRACT関数を使う必要があります。

次の表に、各演算結果のデータ型を示します。

オペランド1
演算子
オペランド2
結果のデータ型

TIME |

DATE |

TIMETAMP

-

TIME |

DATE |

TIMESTAMP

INTERVAL DAY TO SECOND

TT_DATE

-

TT_DATE

TT_BIGINT(日数)

日時

+または-

INTERVAL

日時

INTERVAL

+

日時

日時

INTERVAL

+または-

INTERVAL

INTERVAL

INTERVAL

*または/

数値

INTERVAL

数値

*

INTERVAL

INTERVAL

例1.20

SELECT TT_DATE1 - TT_DATE2 FROM t1;

SELECT EXTRACT(DAY FROM TIMESTAMP1-TIMESTAMP2) FROM t1;

SELECT * FROM t1 WHERE TIMESTAMP1 -TIMESTAMP2 = NUMTODSINTERVAL(10, 'DAY');

SELECT SYSDATE + NUMTODSINTERVAL(20,'SECOND') FROM dual;

SELECT EXTRACT (SECOND FROM TIMESTAMP1-TIMESTAMP2) FROM dual;

/* select the microsecond difference between two timestamp values d1 and d2 */

SELECT 1000000*(EXTRACT(DAY FROM d1-d2)*24*3600+

EXTRACT(HOUR FROM d1-d2)*3600+
EXTRACT(MINUTE FROM d1-d2)*60+EXTRACT(SECOND FROM d1-d2)) FROM d1;

例1.21

この例では、2つの列にタイムスタンプの値を挿入してから、EXTRACT関数を使用してそれらの2つの値を減算します。

Command> CREATE TABLE ts (id TIMESTAMP, id2 TIMESTAMP);

Command> INSERT INTO ts VALUES (timestamp '2007-01-20 12:45:23', timestamp '2006-12-25 17:34:22');

1 row inserted.

Command> SELECT EXTRACT (DAY FROM id - id2) from ts;

< 25 >

1 row found.

例1.22

次の問合せでは、エラーが戻されます。

結果がINTERVALとなるSELECT文は実行できません。

SELECT TIMESTAMP1 -TIMESTAMP2 FROM t1

SELECT DATE1 - DATE2 FROM t1;;

INTERVAL YEAR TO MONTHとINTERVAL DAY TO SECONDは比較できません。

SELECT * FROM t1 WHERE TIMESTAMP1 -TIMESTAMP2 = NUMTOYMINTERVAL(10, 'YEAR');

INTERVAL DAY TO SECONDとINTERVAL DAYは比較できません。

SELECT * FROM t1 WHERE TIMESTAMP1 -TIMESTAMP2 = INTERVAL '10' DAY;

INTERVAL DAY TO SECONDからYEARを抽出することはできません。

SELECT EXTRACT (YEAR FROM TIMESTAMP1-TIMESTAMP2) FROM dual;

日時および時間隔の算術演算の制限

日時および時間隔の算術を実行する場合、次の制限を考慮する必要があります。