TIMESTAMPDIFF スカラー関数

TIMESTAMPDIFF 関数は、2 つのタイム・スタンプの間の差に基づいて、最初の 引数で定義されたタイプの見積もり間隔数を戻します。

構文図を読むビジュアルシンタックスダイアグラムをスキップするTIMESTAMPDIFF( 数値式, 文字列式)

スキーマは SYSIBM です。

数値式
組み込みの SMALLINT データ・タイプまたは INTEGER データ・タイプの値を戻す式。 この値は、2 つのタイム・スタンプの間の差を判別するのに使用する間隔を指定します。 下の表は、numeric-expression の有効値をリストしています。
表 1. 2 つのタイム・スタンプの間の差を判別するのに使 用する numeric-expression およびそれに相当する間隔に対する有効値
numeric-expression に対する有効値 相当する間隔
1 マイクロ秒
2
4
8 時間
16
32
64
128 四半期
256
文字列式

LOB 以外の組み込みの文字ストリング・データ・タイプまたはグラフィック・ストリング・データ・タイプの値を戻す式。 この値は、2 つのタイム・スタンプの減算を行い、その結果を長さ 22 の文字ストリングに変換した結果となることが予想されます。 ストリング値の小数点の右側が 6 桁を超えてはなりません。

指定された引数が グラフィック・ストリングの場合、この引数は最初に文字ストリングに変換されてから 関数を実行します。
以下の表は、string-expression のエレメントについて説明しています。
表 2. TIMESTAMPDIFF ストリング・エレメント
ストリング・エレメント 有効値 小数点からの文字位置 (負は左方)
1 から 9998 またはブランク -14 から -11
0 から 11 またはブランク -10 から -9
0 から 30 またはブランク -8 から -7
時間 0 から 24 またはブランク -6 から -5
0 から 59 またはブランク -4 から -3
0 から 59 -2 から -1
小数点記号 period 0
マイクロ秒 000000 から 999999 1 から 6

この関数の結果は、2 番目の引数と同じ符号が付いた整数です。

結果は NULL 値になることがあります。いずれかの引数が NULL 値である場合、結果は NULL 値になります。

戻り値は、以下の表に示されているように、インターバルごとに決定されます。

表 3. TIMESTAMPDIFF 計算
結果として生成されるインターバル 期間エレメントを使用した計算
years
四半期 (月 + (年 * 12)) / 3 の整数値
月 + (年 * 12)
((日 + (月 * 30)) / 7) + (年 * 52) の整数値
日 + (月 * 30) + (年 * 365)
時間 hours+ ((days + (months*30)+(years*365))*24)
分 (期間の絶対値は 40850913020759.999999 を超えてはなりません) minutes + (hours+((days+(months*30)+(years*365))*24))*60
秒 (期間の絶対値は 680105031408.000000 より小さくなければなりません)
秒 + (分 + (時間 + ((日 + ( months*30 )
+ ( years*365 ))*24))*60 )*60
マイクロ秒 (期間の絶対値は 3547.483648 より小さくなければなりません) マイクロ秒 + (秒 + (分 * 60)) * 1000000

差の見積もりには、以下の前提が使用されます。

  • 1 年は 365 日
  • 1 年は 52 週
  • 1 年は 12 カ月
  • 1 カ月は 30 日
  • 1 日は 24 時間
  • 1 時間は 60 分
  • 1 分は 60 秒

これらの前提事項の使用は、一部の結果値が間隔の見積もりであることを示します。 次の例を考慮してください。

  • 月の日数が 30 日未満の場合の、1 カ月の差。
    TIMESTAMPDIFF(16, CHAR(TIMESTAMP('1997-03-01-00.00.00') 
    		- TIMESTAMP('1997-02-01-00.00.00')))

    タイム・スタンプの算術計算の結果は、期間 00000100000000.000000、または 1 カ月です。 間隔引数に 16 (日数) を指定して TIMESTAMPDIFF 関数を呼び出すと、1 カ月に 30 日という前提事項が適用され、結果は 30 になります。

  • 月の日数が 30 日未満の場合の、1 カ月より 1 日少ない差。
    TIMESTAMPDIFF(16, CHAR(TIMESTAMP('1997-03-01-00.00.00') 
    		- TIMESTAMP('1997-02-02-00.00.00')))

    タイム・スタンプの算術計算の結果は、期間 00000027000000.000000、または 27 日です。 間隔引数に 16 (日数) を指定して TIMESTAMPDIFF 関数を呼び出すと、結果は 27 になります。

  • 月の日数が 31 日である場合の、1 カ月より 1 日少ない差。
    TIMESTAMPDIFF(64, CHAR(TIMESTAMP('1997-09-01-00.00.00') 
    		- TIMESTAMP('1997-08-02-00.00.00')))

    タイム・スタンプの算術計算の結果は、期間 00000030000000.000000、または 30 日です。 間隔引数 (月) に 64 を指定して TIMESTAMPDIFF 関数を呼び出すと、結果は 0 になります。 期間の日数部分は 30ですが、間隔が指定された月が経過したため無視されます。

例: 以下のステートメントでは月単位で従業員の年齢 を見積もり、その値を AGE_IN_MONTHS として戻します。
SELECT
  TIMESTAMPDIFF(64, CAST(CURRENT_TIMESTAMP-CAST(BIRTHDATE AS TIMESTAMP)
                AS CHAR(22)))
    AS AGE_IN_MONTHS
  FROM EMPLOYEE;