バッチ入力 (つまり、プレーン テキスト) を検証しています。timestamp
検証の最初の段階は、タイムスタンプに配置する前に、順序付けする必要がある列が実際に正しい形式であることを確認することです。この場合'yyyy/mm/dd hh24:mi:ss:ff2'
。
ただし、Oracle は、タイムスタンプ形式の小数秒の精度から先頭の 0 を削除しているように見えます。たとえば、009
はそのままでは 2 (またはそれ以下) の精度であると想定されますが、 では0099
ありません0090
。最初の 2 つの例は、明らかに正しくありません。日付/時刻形式モデルの目的上、秒の小数部の精度が先行する 0 を除く精度であるように見えます。
動作は精度に関係なく発生するようです。
この例は正しいです:
select to_timestamp('2012/06/20 05:12:41:91','yyyy/mm/dd hh24:mi:ss:ff2') t
from dual;
T
---------------------------------------------------------------------------
20-JUN-12 05.12.41.910000000
これらの例は正しくありません:
エラーが発生することが予想されますが、切り捨てられても対処できます。
select to_timestamp('2012/06/20 05:12:41:091','yyyy/mm/dd hh24:mi:ss:ff2') t
from dual;
T
---------------------------------------------------------------------------
20-JUN-12 05.12.41.091000000
select to_timestamp('2012/06/20 05:12:41:0091','yyyy/mm/dd hh24:mi:ss:ff2') t
from dual;
T
---------------------------------------------------------------------------
20-JUN-12 05.12.41.009100000
select to_timestamp('2012/06/20 05:12:41:00091','yyyy/mm/dd hh24:mi:ss:ff2') t
from dual;
T
---------------------------------------------------------------------------
20-JUN-12 05.12.41.000910000
このエラーは正しいです。小数秒の精度は 3 です。
select to_timestamp('2012/06/20 05:12:41:901','yyyy/mm/dd hh24:mi:ss:ff2') t
from dual;
select to_timestamp('2012/06/20 05:12:41:901','yyyy/mm/dd hh24:mi:ss:ff2') t
*
ERROR at line 1:
ORA-01880: the fractional seconds must be between 0 and 999999999
私はリリース 11.2.0.1.0 を使用していますが、この動作は 11.1.0.6.0 および 9.2.0.1.0 でも発生するため、明らかにしばらく前から存在しています。
これは私が以前は知らなかった「機能」ですか?
解決策は、すべてのタイムスタンプの精度が 6 桁であると想定しているようですが、与えられたデータが正しいことを実際に検証できる別の方法はありますか?