我正在验证一些批量输入(即纯文本);验证的第一阶段是确保我必须订购的列实际上是正确的timestamp
格式,然后再尝试将其放入我的时间戳中。在这种情况下'yyyy/mm/dd hh24:mi:ss:ff2'
。
但是,Oracle 似乎从时间戳格式的小数秒精度中删除了前导 0。例如009
,假设精度为 2(或更小)0099
,但不是0090
。前两个例子显然是不正确的。就日期时间格式模型而言,似乎小数秒精度就是精度,不包括前导 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 位,但是否有另一个可以真正验证我提供的数据是否正确?