在Oracle中将时间戳格式转换为整数

时间:2018-07-06 09:53:31

标签: sql oracle oracle11g

我具有格式为“ 01-JAN-00 10.05.54.170489000 AM”的时间戳记值。当我尝试使用“ yyyymmddhhmm24missff”格式转换为整数时:

select to_number(to_char(date_column,'yyyymmddhhmm24missff') from table_name;

我得到的值是20000101100554170489。最后3位数字丢失。我需要确切的值作为20000101100554170489000。

如何在电话号码中保留最后三位数字?

1 个答案:

答案 0 :(得分:1)

当我通过CTE提供的纯时间戳记运行查询时,您的查询(稍作更正)会得到您想要的结果:

set numwidth 23
alter session set nls_timestamp_format = 'DD-MON-RR HH:MI:SS.FF AM';

with table_name (date_column) as (
  select to_timestamp('01-JAN-00 10.05.54.170489000 AM', 'DD-MON-RR HH:MI:SS.FF AM')
  from dual
)
select date_column, to_number(to_char(date_column,'yyyymmddhh24missff')) as result
from table_name;

DATE_COLUMN                                      RESULT
------------------------------- -----------------------
01-JAN-00 10:05:54.170489000 AM 20000101100554170489000

我看到的唯一获得结果的方法是将时间戳列实际上限制在该精度范围内;即date_column timestamp(6)

with table_name (date_column) as (
  select cast(to_timestamp('01-JAN-00 10.05.54.170489000 AM', 'DD-MON-RR HH:MI:SS.FF AM')
    as timestamp(6))
  from dual
)
select date_column, to_number(to_char(date_column,'yyyymmddhh24missff')) as result
from table_name;

DATE_COLUMN                                      RESULT
------------------------------- -----------------------
01-JAN-00 10:05:54.170489000 AM    20000101100554170489

想要显示比实际值所允许的精度更高的精度似乎很奇怪,但是如果您真的想始终包含最后三个零,则可以使用ff9覆盖列精度:

with table_name (date_column) as (
  select cast(to_timestamp('01-JAN-00 10.05.54.170489000 AM', 'DD-MON-RR HH:MI:SS.FF AM')
    as timestamp(6))
  from dual
)
select date_column, to_number(to_char(date_column,'yyyymmddhh24missff9')) as result
from table_name;

DATE_COLUMN                                      RESULT
------------------------------- -----------------------
01-JAN-00 10:05:54.170489000 AM 20000101100554170489000

时间戳(或日期)没有内在格式,您只是看到客户端将其转换为字符串(可能基于会话NLS设置)。我已经运行alter session来匹配您似乎正在使用的内容。请注意,即使我将数据类型限制为timestamp(6),使用ff的客户端默认格式仍然显示9位精度。查询表时看到所有九个数字并不意味着这些值实际上可以具有那么多的精度,在这种情况下,最后显示的三位数始终为零。