これは、予想どおり、実際の値ではなく、タイムスタンプ間の差の推定値TIMESTAMPDIFF
を返すという事実の結果です。
リファレンスの435 ページ (iSeries の場合) から:
要素の値を要求された間隔タイプに変換するときは、次の仮定が使用されます。
- 1年は365日です。
- 1年は52週です。
- 1年は12ヶ月です。
- 1 四半期は 3 か月です。
- 1 か月は 30 日です。
- 1 週間は 7 日です。
- 1 日は 24 時間です。
- 1時間は60分です。
- 1分は60秒です。
- 1 秒は 1000000 マイクロ秒です。
実際に使用される計算は次のとおりです。
秒 + (分 + (時間 + ((日 + (月 * 30) + (年 * 365)) * 24)) * 60) * 60
これは、明らかな理由から不正確です。役に立ちません。
これは、タイムスタンプの算術結果が返される方法の直接的な結果のようです。
あれは;
SELECT
TIMESTAMP('1971-03-02 00:00:00') - TIMESTAMP('1970-01-01 00:00:00')
FROM sysibm/sysdummy1
戻り値:
10,201,000,000.000000
Which can be divided into:
1
年
02
月
01
日々
00
時間
00
分
00
秒
000000
マイクロ秒
これは不正確な期間/期間情報です。このタイプのデータが役立つ状況は数多くありますが、これはその 1 つではありません。
簡単な答え:データベースでは正確な答えを正しく計算することはできません。
長い答え:
計算は可能ですが、かなり複雑で、データベース内での計算には適していません。ここでそれらを再現するつもりはありません (興味があれば、特にさまざまなサブクラスについて JodaTimeChronology
を調べてください)。あなたの最大の問題は、月がすべて同じ長さではないという事実です。また、タイムスタンプが UTC 以外の場合、大きな問題が発生します。具体的には、サマータイムが計算に大混乱をもたらすことになります。なんで?オフセットは、どの国でもいつでも変更できるためです。
ミリ秒数が必要な理由を説明できますか? Java を使用している (または使用できる) ことを願っていますjava.time
。しかし、iSeries を使用している場合は、おそらく RPG です...