我正在尝试使用systimestamp在instert上以全9精度填充一个Oracle时间戳(9)
column MY_TS format 99999999999999999999999999
SElECT TO_NUMBER(TO_CHAR(systimestamp, 'YYYYMMDDHH24MISSSSSFF'), '99999999999999999999999999') as MY_TS FROM DUAL;
CREATE TABLE T1 (MY_TS timestamp(9));
INSERT INTO T1 VALUES(systimestamp);
SELECT TO_NUMBER(TO_CHAR(MY_TS, 'YYYYMMDDHH24MISSSSSFF'), '99999999999999999999999999') as MY_TS FROM T1;
产量
MY_TS
---------------------------
20180802152155270705139
Table created.
1 row created.
MY_TS
---------------------------
20180802152155270735103000
似乎丢失了最后3位精度。
我一直在阅读,Oracle systimestamp的默认值为6,但是可以修改。但是我似乎无法进入一个页面说明该如何完成(大多数都与价值形成有关)。
答案 0 :(得分:3)
似乎丢失了最后3位精度。
它不会丢失最后3位数字的精度; FF
格式模型正在显示default precision of the data type:
FF [1..9]
分数秒;不打印任何基数字符(使用X格式元素添加基数字符)。在FF后使用数字1到9来指定返回的datetime值的小数秒部分的位数。 如果不指定数字,则Oracle数据库将使用为datetime数据类型指定的精度或数据类型的默认精度。
SELECT TO_CHAR(systimestamp, 'YYYYMMDDHH24MISSFF') as MY_TS FROM DUAL
UNION ALL
SELECT 'YYYYMMDDHHMMSSFFFFFFFFF' FROM DUAL;
输出:
MY_TS
-----------------------
20180802230042489334
YYYYMMDDHHMMSSFFFFFFFFF
因此,它仅输出小数秒至微秒精度,即the default precision:
TIMESTAMP [(fractional_seconds_precision)]
日期的年,月,日值以及时间的小时,分钟和秒值,其中
fractional_seconds_precision
是小数部分中的位数。第二日期时间字段。fractional_seconds_precision
的可接受值为0到9。默认值为6 。默认格式由NLS_DATE_FORMAT
参数显式确定,或由NLS_TERRITORY
参数隐式确定。大小从7到11个字节不等,具体取决于精度。此数据类型包含日期时间字段YEAR
,MONTH
,DAY
,HOUR
,MINUTE
和SECOND
。它包含小数秒,但没有时区。
如果您更改时间戳的精度:
SELECT TO_CHAR(systimestamp(9), 'YYYYMMDDHH24MISSFF') as MY_TS FROM DUAL
UNION ALL
SELECT 'YYYYMMDDHHMMSSFFFFFFFFF' FROM DUAL;
输出:
MY_TS
-----------------------
20180802230708135745000
YYYYMMDDHHMMSSFFFFFFFFF
哪一个给出的TIMESTAMP
精度为9位数字。
您还可以使用FF9
格式模型(而不是仅使用数据类型的默认精度的FF
)在输出格式中指定精度:
SELECT TO_CHAR(systimestamp, 'YYYYMMDDHH24MISSFF9') as MY_TS FROM DUAL
UNION ALL
SELECT 'YYYYMMDDHHMMSSFFFFFFFFF' FROM DUAL;
输出:
MY_TS
-----------------------
20180802230936652602000
YYYYMMDDHHMMSSFFFFFFFFF