Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.27.1 日時演算の指定形式および規則

値式中に日時演算を指定して,日時データの演算を使用した検索ができます。

〈この項の構成〉

(1) 指定形式

日時演算::={値式一次子日時値式ラベル付き間隔 〔{*|/}値式一次子〕
              |日時値式ラベル付き間隔 〔{*|/}値式一次子〕}

(2) 指定形式の説明

値式一次子

値式一次子については,「7.20.1 値式の指定形式および規則」を参照してください。

日時値式

日時値式については,「7.20.1 値式の指定形式および規則」を参照してください。

ラベル付き間隔

ラベル付き間隔については,「7.28 ラベル付き間隔」を参照してください。

(3) 日時演算ができるデータ型

DATE型,TIME型,およびTIMESTAMP型のデータに対して日時演算を実行できます。

なお,日付を表す既定の入力表現,時刻を表す既定の入力表現,または時刻印を表す既定の入力表現の形式に従っている文字列定数(CHARVARCHAR)に対しても日時演算を実行できます。文字列定数が指定された場合,その文字列定数を日時データに変換して日時演算が行われます。

日付を表す既定の入力表現,時刻を表す既定の入力表現,および時刻印を表す既定の入力表現については,「6.3.3 既定の文字列表現」を参照してください。

(4) 規則

(a) 共通の規則

  1. DATE型の演算を実行した場合は,演算結果のデータ型もDATE型になります。

  2. TIME型の演算を実行した場合は,演算結果のデータ型もTIME型になります。

  3. TIMESTAMP型の演算を実行した場合は,演算結果のデータ型もTIMESTAMP型になります。

  4. 最大500個の演算子(または)を使った日時演算ができます。ただし,演算項に指定した値式中に指定した列が,ビュー表の列,導出表の列,または問合せ名の列の場合,その基となる値式を展開したあとの値式の総数が10,000個以内となるようにしてください。

  5. 演算子(または)の左側に,?パラメタだけの値式を指定できません。

  6. 演算結果の値は,非ナル値制約なし(ナル値を許す)となります。

  7. 演算項がナル値の場合は,演算結果もナル値になります。

  8. 日時演算をする場合は,上記の規則以外に「7.20 値式」の規則も確認してください。

(b) DATE型の日時演算を実行する場合の規則

  1. 演算結果の範囲は,0001年01月01日〜9999年12月31日の間にする必要があります。

  2. 年または月を繰り越して演算されます。例を次に示します。

    (例1)

    DATE'2012-12-31'+2 DAY → DATE'2013-01-02'

    (例2)

    DATE'2013-01-01'-1 DAY → DATE'2012-12-31'
  3. 年,月の演算結果が存在しない日付(小の月の31日,2月30日,およびうるう年以外の年の2月29日)の場合,その月の最終日に修正されます。例を次に示します。

    (例)

    DATE'2013-03-31'+1 MONTH → DATE'2013-04-30'

    このように,演算結果が存在しない日付の場合,その月の最終日に自動的に修正されます。そのため,ある日付に任意の月数を加算し,その結果の日付から同じ月数を引いた場合,必ずしも元の日付に戻りません。例を次に示します。

    (例)

    DATE'2013-03-31'+1 MONTH → DATE'2013-04-30'
    DATE'2013-04-30'-1 MONTH → DATE'2013-03-30'

(c) TIME型の日時演算を実行する場合の規則

  1. 演算結果の範囲は,0時0分0.000000000000秒〜23時59分59.999999999999秒の間にする必要があります。

  2. 小数秒精度が異なる演算の場合,精度が高い方に合わせます(精度が低い方に0を補います)。例えば,演算対象のTIME型のデータの小数秒精度が0の場合に,ラベル付き間隔にMILLISECONDSを指定したときは,TIME型のデータの小数秒精度を3に拡張して演算します。

(d) TIMESTAMP型の日時演算を実行する場合の規則

  1. 演算結果の範囲は,0001年01月01日0時0分0.000000000000秒〜9999年12月31日23時59分59.999999999999秒の間にする必要があります。

  2. 年,月,日の部分の計算方法は,「(b) DATE型の日時演算を実行する場合の規則」に従います。

  3. 小数秒精度が異なる演算の場合,精度が高い方に合わせます(精度が低い方に0を補います)。例えば,演算対象のTIMESTAMP型のデータの小数秒精度が0の場合に,ラベル付き間隔にMILLISECONDSを指定したときは,TIMESTAMP型のデータの小数秒精度を3に拡張して演算します。

  4. 日を繰り越して演算されます。例を次に示します。

    (例1)

    TIMESTAMP'2014-02-01 23:59:59'+1 SECOND → TIMESTAMP'2014-02-02 00:00:00'

    (例2)

    TIMESTAMP'2014-02-02 00:00:00'-1 SECOND → TIMESTAMP'2014-02-01 23:59:59'

    (例3)

    TIMESTAMP'2013-12-31 23:05:06'+2 HOUR → TIMESTAMP'2014-01-01 01:05:06'

(e) ラベル付き間隔に乗除算を指定した場合の規則

  1. ラベル付き間隔に乗除算を指定した場合,次のラベル付き間隔と等価になります。

    • 値式1 ラベル付き間隔修飾子 * 値式2値式1*値式2ラベル付き間隔修飾子

    • 値式1 ラベル付き間隔修飾子 / 値式2値式1/値式2ラベル付き間隔修飾子

    (例)

    C1 DAYS * C2 → (C1*C2) DAYS
    (C1+C2) MINUTES / (C3+C4) → ((C1+C2)/(C3+C4)) MINUTES
  2. ラベル付き間隔の乗除算に指定する値式一次子には,整数(SMALLINT型またはINTEGER型)を指定してください。

  3. ラベル付き間隔の乗除算の値式一次子に?パラメタを単独で指定した場合,?パラメタのデータ型にINTEGER型が仮定されます。

  4. ラベル付き間隔の乗除算の値式一次子の結果がナル値の場合,ラベル付き間隔の結果はナル値になります。

(5) 例題

例題

社員表(EMPLIST)を検索して,入社日(ENT-DAY)から2年以上経過した社員ID(USERID)および社員名(NAME)を検索します。

SELECT "USERID","NAME" FROM "EMPLIST"
    WHERE "ENT-DAY" <= CURRENT_DATE -2 YEARS

下線部分が日時演算の指定で,「2 YEARS」がラベル付き間隔の指定です。