コンテンツにスキップ

16.1.4 相対時間式

相対時間式を使用すると、NOWSYSDATEなどの基準時点からの差をSQL文に直接記述できます。関数を別途呼び出さず、時系列ウィンドウを簡潔に表す場合に便利です。

相対時間リテラル(now - 1h形式)はMachbase 8.0.50以降でサポートします。月/年単位の調整にはADD_TIME、文字列の変換にはTO_DATEを使用します。

クイックリファレンス

説明
NOW / nownow現在時刻(ナノ秒精度)
SYSDATE / sysdatesysdate現在時刻(NOWと同じ)
now - offsetnow - 1h現在時刻からオフセットを減算
now + offsetnow + 30m現在時刻にオフセットを加算
ナノ秒整数の直接使用value + 1000000000ナノ秒単位の整数をDATETIMEへ加算

相対時間単位(リテラルの接尾辞)

接尾辞意味
nsナノ秒500ns
usマイクロ秒20us
msミリ秒15ms
s45s
m30m
h時間12h
d7d
w2w (= 14日)

月(monthmo)と年(yeary)の接尾辞は非対応です。暦上の月や年を移動するには ADD_TIME()を使用します。30d365dは固定の日数のため、暦上の1か月・1年と常に一致するとは限りません。

ADD_TIME関数

月・年など、相対時間リテラルにない暦の調整にはADD_TIME()を使用します。引数、形式、エラー条件は SQL関数辞典を参照してください。

TO_DATE関数

参照区間の開始と終了を日付文字列で指定するときは、TO_DATE()でDATETIME値を作成します。 日付形式と変換エラーはSQL関数辞典を参照してください。

利用パターン

時間区間の絞り込み

-- 直近1時間のデータ(相対時間リテラル)
SELECT * FROM sensor_tag WHERE time > now - 1h;

-- 直近1時間のデータ(ADD_TIME関数)
SELECT * FROM sensor_tag WHERE time > ADD_TIME(now, '0/0/0 -1:0:0');

-- 直近24時間の記録
SELECT * FROM app_log WHERE _arrival_time BETWEEN now - 1d AND now;

-- 直近10分以内のアラーム
SELECT alert_id, level, occurred_at FROM alert_log
 WHERE occurred_at >= sysdate - 10m;

複合時間式

-- 2日6時間15分後
SELECT * FROM maintenance_plan WHERE planned_at < now + 2d6h15m;

-- 秒未満の単位の組み合わせ
SELECT TO_CHAR(now + 3s125ms10us4ns, 'YYYY-MM-DD HH24:MI:SS mmm:uuu:nnn');

TO_DATE結果へのオフセット適用

-- 日付文字列に3日を加算
SELECT TO_CHAR(TO_DATE('2024-05-01', 'YYYY-MM-DD') + 3d, 'YYYY-MM-DD');
-- 結果: 2024-05-04

-- 日付文字列から4時間15分を減算
SELECT TO_CHAR(
    TO_DATE('2024-05-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') - 4h15m,
    'YYYY-MM-DD HH24:MI:SS'
);
-- 結果: 2024-05-01 03:45:00

ナノ秒整数の直接使用

数値リテラルはナノ秒として解釈します。

-- 1秒 = 1,000,000,000ナノ秒
SELECT event_time + 1000000000 AS event_time_plus_1s FROM events;

-- 250ナノ秒を減算
SELECT event_time - 250 AS event_time_minus_250ns FROM events;

制約

  • 相対時間リテラル(1h30mなど)はMachbase 8.0.50以降でのみサポートします。
  • 月(mo)と年(y)単位のリテラルは非対応です。ADD_TIME()の年/月の位置を使用してください。
  • 文字列リテラルはinterval演算でDATETIMEへ暗黙変換されないため、先にTO_DATE()で変換してください。
  • インターバル自体はORDER BY句では使用できません。

エラー処理

状況エラー対処方法
非対応の接尾辞(1y, 5mo)ERR-02034 invalid time expression暦単位にはADD_TIME()、固定期間にはdなどの対応する接尾辞を使用
単位の省略(now + 10)ナノ秒として解釈意図する単位の接尾辞を明示
大きすぎる値(1000000d)ERR_OVERFLOW_INTERVAL値の範囲を縮小

LOGのDURATION

相対時間リテラルとDURATIONは役割が異なります。event_time >= now - 1hは選択列のWHERE条件で、 DURATIONはLOGの_arrival_time範囲を指定します。TAGの時間列やユーザー定義DATETIME列にはWHERE条件を使用してください。

SELECT ... FROM log_table
 [WHERE ...]
 DURATION n unit [BEFORE base_time | AFTER base_time]
 [GROUP BY ...] [HAVING ...] [ORDER BY ...] [LIMIT ...]

SELECT ... FROM log_table
 [WHERE ...]
 DURATION FROM from_time TO to_time
 [GROUP BY ...] [HAVING ...] [ORDER BY ...] [LIMIT ...]

上記は基本形式です。期間にはHOURMINUTEDAYなどの単位を使用します。全範囲を表すALLも使用できます。 DURATIONはWHEREの後、GROUP BY・ORDER BYの前に置きます。

形式範囲指定されるスキャン方向
DURATION 1 HOUR現在時刻を基準とする直近1時間新しい順
DURATION 1 HOUR BEFORE tt−1時間からtまで新しい順
DURATION 1 HOUR AFTER ttからt+1時間まで古い順
DURATION FROM a TO b, a < baからbまで古い順
DURATION FROM a TO b, a > bbからaまで新しい順

範囲の両端を含みます。FROMとTOが同時刻なら、その時刻の行が対象です。スキャン方向と結合・集計後の 最終出力順は区別してください。結果順序が必要な場合はORDER BYを明示し、同時刻の複数行には追加のソートキーを指定します。

次の例では、終了時刻にある2番の行も選択されます。

CREATE LOG TABLE ch7_ref_duration (event_id INTEGER);
INSERT INTO ch7_ref_duration(_arrival_time, event_id)
VALUES (TO_DATE('2026-01-01 10:00:00', 'YYYY-MM-DD HH24:MI:SS'), 1);
INSERT INTO ch7_ref_duration(_arrival_time, event_id)
VALUES (TO_DATE('2026-01-01 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), 2);

SELECT event_id FROM ch7_ref_duration
 DURATION 1 HOUR BEFORE TO_DATE('2026-01-01 11:00:00', 'YYYY-MM-DD HH24:MI:SS')
 ORDER BY event_id;

DROP TABLE ch7_ref_duration;

結果は1・2番です。連続する区間を日別に分ける場合、 WHERE _arrival_time >= 開始 AND _arrival_time < 終了のように半開区間を使用すると、境界行の二重集計を防げます。 LOGとLOOKUPが混在するクエリでは、DURATIONの代わりにLOG列のWHERE範囲を使用してください。

関連ドキュメント

最終更新日