TimesTenの時間隔
この項の内容は次のとおりです。
DATEデータ型およびTIMEデータ型の使用
この項では、DATE、TIMEおよびTIMESTAMPの各データ型の例を示します。
DATE型のdcol列とTIME型のtcol列を含む、sampleという名前の表を作成するには、次を使用します。
CREATE TABLE sample (tcol TIME, dcol DATE);
sample表にDATEとTIMEの値を挿入する構文は、次のとおりです。
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';
ノート:
TIME、DATEおよび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 |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
|
- (減算) |
|
|
|
|
|
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
TT_DATE |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
|
- (減算) |
|
|
|
|
|
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
TIMESTAMP |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
|
- (減算) |
|
|
|
|
|
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
TT_TIMESTAMP |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
|
|
- (減算) |
|
|
|
|
|
|
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
|
NUMERIC |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
該当なし |
|
+ (加算) |
|
|
|
|
該当なし |
サポートなし |
|
- (減算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
該当なし |
サポートなし |
|
* (乗算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
該当なし |
|
|
/ (除算) |
サポートなし |
サポートなし |
サポートなし |
サポートなし |
該当なし |
サポートなし |
|
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 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に対して終了します。 -
時間隔データ型は、完結した式の最終結果に使用することはできません。時間隔の結果から必要な要素を抽出するには、
EXTRACT関数を使用する必要があります。