ヘッダーをスキップ

Oracle TimesTen In-Memory Database APIおよびSQLリファレンス・ガイド リリース6.0 B25770-01 |
| 目次 | 索引

前へ | 次へ |

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

日付および時刻の算術は、次の構文でサポートされています。

DateVal1 - DateVal2: 日数の差を整数として戻します。
TimeVal1 - TimeVal2またはTimestampVal1 - TimestampVal2: 差をINTERVAL DAY TO SECONDで戻します。
DateTimeVal {+|-} IntervalValまたは
IntervalVal + DateTimeValまたは
IntervalVal1 {+|-} IntervalVal2または
IntervalVal {*|/} NumericValまたは
NumericVal * IntervalVal

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

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

オペランド1 | 演算子 | オペランド2 | 結果のデータ型
TIME/TIMESTAMP | - | TIME/ TIMESTAMP | INTERVAL DAY TO SECOND
DATE | - | DATE | NUM OF DAYS
日時 | +または- | INTERVAL | 日時
INTERVAL | + | 日時 | 日時
INTERVAL | +または- | INTERVAL | INTERVAL
INTERVAL | *または/ | 数値 | INTERVAL
数値 | * | INTERVAL | INTERVAL

##### 例9.6

    SELECT DATE1 - 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;

##### 例9.7

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

    結果がINTERVALとなるSELECT文は実行できません。
    SELECT TIMESTAMP1 -TIMESTAMP2 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;

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

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

- INTERVAL YEAR、INTERVAL 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に対して終了します。