转载

如何在运算过程中保留timestamp类型数据的毫秒精度?

今天在对某些timestamp类型的数据进行运算的过程中,发现毫秒数据都丢失了。
我们做个简单的测试,创建一个测试表只包含一列,数据类型为timestamp,然后插入两条记录。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> select * from v$version;

  3. BANNER
  4. ----------------------------------------------------------------
  5. Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
  6. PL/SQL Release 10.2.0.4.0 - Production
  7. CORE    10.2.0.4.0    Production

  8. TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
  9. NLSRTL Version 10.2.0.4.0 - Production

  10. SQL>
  11. SQL> create table hoegh(h timestamp(6));

  12. Table created

  13. SQL> desc hoegh
  14. Name Type Nullable Default Comments
  15. ---- ------------ -------- ------- --------
  16. H TIMESTAMP(6) Y

  17. SQL>
  18. SQL> insert into hoegh values(systimestamp);

  19. 1 row inserted

  20. SQL> insert into hoegh values(systimestamp-1);

  21. 1 row inserted

  22. SQL> commit;

  23. Commit complete

  24. SQL> select * from hoegh;

  25. H
  26. --------------------------------------------------------------------------------
  27. 25-6月 -16 05.39.04.609000 上午
  28. 24-6月 -16 05.39.12.000000 上午

  29. SQL>
  30. SQL>
我们看到第一条数据包含毫秒数据,而第二条数据的毫秒数据为0。那么是凑巧了吗,当然不是。
那么,如何保留毫秒数据呢?我们可以使用numtodsinterval函数。
numtodsinterval(<x>,<c>) 
其中,
x是一个数字,
c是一个字符串,表明x的单位,这个函数把x转为interval day to second数据类型
常用的单位有 ('day','hour','minute','second')

接下来,我们通过例子看一下这个函数的用法。

点击(此处)折叠或打开

  1. SQL> insert into hoegh values(systimestamp+numtodsinterval(-1,'day'))--减一天
  2.   2 ;

  3. 1 row inserted

  4. SQL> insert into hoegh values(systimestamp+numtodsinterval(-1,'hour'))--减一小时
  5.   2 ;

  6. 1 row inserted

  7. SQL> insert into hoegh values(systimestamp+numtodsinterval(-1,'minute'))--减一分钟
  8.   2 ;

  9. 1 row inserted

  10. SQL> insert into hoegh values(systimestamp+numtodsinterval(-1,'second'))--减一秒
  11.   2 ;

  12. 1 row inserted
  13. SQL> insert into hoegh values(systimestamp+numtodsinterval(500/1000,'second'))--减500毫秒
  14.   2 ;

  15. 1 row inserted

  16. SQL> commit;

  17. Commit complete

  18. SQL> select * from hoegh;

  19. H
  20. --------------------------------------------------------------------------------
  21. 25-6月 -16 05.39.04.609000 上午
  22. 24-6月 -16 05.39.12.000000 上午
  23. 24-6月 -16 05.46.08.556000 上午
  24. 25-6月 -16 04.46.42.314000 上午
  25. 25-6月 -16 05.46.21.346000 上午
  26. 25-6月 -16 05.47.36.039000 上午
  27. 25-6月 -16 05.48.27.288000 上午

  28. 7 rows selected

  29. SQL>


                                                                                                       ~~~~~~~ the end~~~~~~~~~
                                                                                                                                                                                                               hoegh
                                                                                                                                                                                                           2016.06.24


正文到此结束
Loading...