TimesTenの時間隔

時間隔データ型の使用

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

時間隔である単一フィールドのリテラルを式に指定することはできますが、時間隔データ型を戻す完結した式は指定できません。時間隔の結果から必要な要素を抽出するには、かわりにEXTRACT関数を使用する必要があります。

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

INTERVAL [+/-] CharString IntervalQualifier

DATEデータ型およびTIMEデータ型の使用

この項では、DATETIMEおよびTIMESTAMPの各データ型の例を示します。

DATE型のdcol列とTIME型のtcol列を含む、sampleという名前の表を作成するには、次を使用します。

CREATE TABLE sample (tcol TIME, dcol DATE);

sample表にDATETIMEの値を挿入する構文は、次のとおりです。

INSERT INTO sample VALUES (TIME '12:00:00', DATE '1998-10-28');

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';

TIMESTAMPデータ型のtscol列を含む、sample2という名前の表を作成して、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';

ノート:

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

タイム・ゾーン変換の処理

TimesTenでは、TIMEZONEはサポートされません。TIMEおよびTIMESTAMPデータ型値は、時差の調整を行わずに格納されます。アプリケーションでは、あるタイムゾーンを想定し、データベースに値を送信する前に、TIMEおよびTIMESTAMPをそのタイムゾーンに変換する必要があります。たとえば、アプリケーションでタイムゾーンを太平洋標準時間と想定します。アプリケーションで太平洋夏時間または東部標準時間のTIMEおよびTIMESTAMP値を使用している場合は、TIMEおよびTIMESTAMPを太平洋標準時間に変換する必要があります。

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

日付、タイムスタンプおよび時間隔データで算術演算を実行できます。TimesTenでは、次のルールに従って結果が計算されます。

  • DATEまたはTIMESTAMP値に数値を加算、またはそこから数値を減算できます。TimesTenでは内部的にTIMESTAMP値をDATE値に変換します。

  • TT_DATEまたはTT_TIMESTAMP値に数値を加算、またはそこから数値を減算でき、結果として得られる値はそれぞれTT_DATEまたはTT_TIMESTAMPになります。

  • 数値は日数として扱われます。たとえば、SYSDATE + 1は、明日になります。SYSDATE - 7は、1週間前になります。

  • 2つの日付列の減算により、2つの日付間の日数が得られます。戻り型は数値です。

  • 日付値の加算はできません。日付値またはタイムスタンプ値の乗算や除算はできません。

表1-4に、日時の演算処理のマトリックスを示します。

表1-4 DateTime算術演算

空白 DATE TT_DATE TIMESTAMP TT_TIMESTAMP NUMERIC INTERVAL

DATE

該当なし

該当なし

該当なし

該当なし

該当なし

該当なし

+ (加算)

サポートなし

サポートなし

サポートなし

サポートなし

DATE

DATE

- (減算)

NUMBER

NUMBER

INTERVAL

INTERVAL

DATE

DATE

* (乗算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

/ (除算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

TT_DATE

該当なし

該当なし

該当なし

該当なし

該当なし

該当なし

+ (加算)

サポートなし

サポートなし

サポートなし

サポートなし

TT_DATE

TT_DATE

- (減算)

NUMBER

TT_BIGINT

INTERVAL

INTERVAL

TT_DATE

TT_DATE

* (乗算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

/ (除算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

TIMESTAMP

該当なし

該当なし

該当なし

該当なし

該当なし

該当なし

+ (加算)

サポートなし

サポートなし

サポートなし

サポートなし

DATE

TIMESTAMP

- (減算)

INTERVAL

INTERVAL

INTERVAL

INTERVAL

DATE

TIMESTAMP

* (乗算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

/ (除算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

TT_TIMESTAMP

該当なし

該当なし

該当なし

該当なし

該当なし

該当なし

+ (加算)

サポートなし

サポートなし

サポートなし

サポートなし

TT_TIMESTAMP

TT_TIMESTAMP

- (減算)

INTERVAL

INTERVAL

INTERVAL

INTERVAL

TT_TIMESTAMP

TT_TIMESTAMP

* (乗算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

/ (除算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

NUMERIC

該当なし

該当なし

該当なし

該当なし

該当なし

該当なし

+ (加算)

DATE

TT_DATE

DATE

TT_TIMESTAMP

該当なし

サポートなし

- (減算)

サポートなし

サポートなし

サポートなし

サポートなし

該当なし

サポートなし

* (乗算)

サポートなし

サポートなし

サポートなし

サポートなし

該当なし

INTERVAL

/ (除算)

サポートなし

サポートなし

サポートなし

サポートなし

該当なし

サポートなし

INTERVAL

該当なし

該当なし

該当なし

該当なし

該当なし

該当なし

+ (加算)

DATE

TT_DATE

TIMESTAMP

TT_TIMESTAMP

サポートなし

INTERVAL

- (減算)

サポートなし

サポートなし

サポートなし

サポートなし

サポートなし

INTERVAL

* (乗算)

サポートなし

サポートなし

サポートなし

サポートなし

INTERVAL

サポートなし

/ (除算)

サポートなし

サポートなし

サポートなし

サポートなし

INTERVAL

サポートなし

ノート:

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

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;

この例では、2つの列にTIMESTAMP値を挿入してから、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.

次の問合せでは、エラーが戻されます。結果がINTERVALとなるSELECT文は実行できません。

SELECT timestamp1 - timestamp2 FROM t1;

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

SELECT * FROM t1 WHERE timestamp1 - timestamp2 = NUMTOYMINTERVAL(10, 'YEAR');

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

SELECT * FROM t1 WHERE timestamp1 - timestamp2 = INTERVAL '10' DAY;

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

SELECT EXTRACT (YEAR FROM timestamp1 - timestamp2) FROM dual;

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

日時および時間隔の算術演算を実行する場合、次の制限を考慮してください。

  • INTERVAL YEARINTERVAL MONTHに対してDATEおよびTIMESTAMP型を使用した加算または減算の結果は終了しません。たとえば、DATEまたはTIMESTAMPの2004-02-29に1年を追加すると、2005年2月29日は存在しないため(2005年はうるう年ではありません)、日付算術エラー(TimesTenエラー2787)になります。INTERVALの1月をDATEの2005-01-30に追加すると、2月に30日はないため同じエラーになります。

  • 結果はINTERVAL DAYに対して終了します。

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