楼主: bfc99

[SQL] 【已解决】如何获取timestamp类型的精度到纳秒级

[复制链接]
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
31#
发表于 2015-7-29 13:33 | 只看该作者
taomct 发表于 2015-7-28 19:51
CREATE OR REPLACE FUNCTION NEWTIME_FUNC
RETURN VARCHAR2
AUTHID CURRENT_USER

我保证你这方法肯定会出现重复,只不过概率比较低

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
32#
发表于 2015-7-29 16:31 来自手机 | 只看该作者
bfc99 发表于 2015-7-28 14:46
并发度很高,有业务需求要取操作时间,原来以为用到微秒(精度6)应该不会有重复了。但发现还是出现重复了 ...

如果并行,无论多高精度都可能重碼。

使用道具 举报

回复
论坛徽章:
14
2009新春纪念徽章
日期:2009-01-04 14:52:28沸羊羊
日期:2015-03-04 14:51:52优秀写手
日期:2014-03-14 06:00:13马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15蜘蛛蛋
日期:2012-06-27 21:08:142012新春纪念徽章
日期:2012-01-04 11:53:29ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26
33#
发表于 2015-7-29 16:33 来自手机 | 只看该作者
本帖最后由 yulihua49 于 2015-7-29 16:37 编辑

正确的做法,重碼后再取。或使用GUID.也可以与其他列配合做主键。或使用serial.

使用道具 举报

回复
论坛徽章:
176
20周年集字徽章-20	
日期:2020-10-28 14:31:21ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44ITPUB15周年纪念
日期:2018-02-09 14:12:58ITPUB18周年纪念章
日期:2018-09-17 10:09:4919周年集字徽章-庆
日期:2019-08-27 15:07:44状元
日期:2015-11-19 12:58:23
34#
发表于 2015-7-29 17:04 | 只看该作者
oracle_cj 发表于 2015-7-28 16:05
我连工具都传上来吧

认真读帖的好处就是,有收获。

使用道具 举报

回复
论坛徽章:
176
20周年集字徽章-20	
日期:2020-10-28 14:31:21ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB社区12周年站庆徽章
日期:2013-08-13 16:52:38itpub13周年纪念徽章
日期:2014-10-08 15:21:35ITPUB14周年纪念章
日期:2015-10-26 17:23:44ITPUB15周年纪念
日期:2018-02-09 14:12:58ITPUB18周年纪念章
日期:2018-09-17 10:09:4919周年集字徽章-庆
日期:2019-08-27 15:07:44状元
日期:2015-11-19 12:58:23
35#
发表于 2015-7-29 17:06 | 只看该作者
dhhb 发表于 2015-7-28 17:04
systimestamp是从OS级别获取的,oracle应该只精确到microsecond. 这个不用想进一步取nanosecond了,换个思路 ...

同意!
LOCALTIMESTAMP也一样是取自OS。

使用道具 举报

回复
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
36#
 楼主| 发表于 2015-7-29 17:07 | 只看该作者
yulihua49 发表于 2015-7-29 16:31
如果并行,无论多高精度都可能重碼。

这个我同意。正在了解业务需求,看看是否有可能用主键来区分。

使用道具 举报

回复
论坛徽章:
30
生肖徽章:猴
日期:2015-03-20 10:13:49ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:31优秀写手
日期:2015-03-07 06:00:14沸羊羊
日期:2015-03-13 13:26:07美羊羊
日期:2015-04-06 20:32:13天蝎座
日期:2015-07-20 12:34:47射手座
日期:2015-09-18 12:38:55乌索普
日期:2016-08-03 07:04:28奥运会纪念徽章:手球
日期:2016-09-26 07:19:26山治
日期:2016-10-19 05:48:10
37#
发表于 2015-7-30 07:07 | 只看该作者
本帖最后由 阿吉2009 于 2015-7-30 08:58 编辑

见楼下。

使用道具 举报

回复
论坛徽章:
30
生肖徽章:猴
日期:2015-03-20 10:13:49ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:31优秀写手
日期:2015-03-07 06:00:14沸羊羊
日期:2015-03-13 13:26:07美羊羊
日期:2015-04-06 20:32:13天蝎座
日期:2015-07-20 12:34:47射手座
日期:2015-09-18 12:38:55乌索普
日期:2016-08-03 07:04:28奥运会纪念徽章:手球
日期:2016-09-26 07:19:26山治
日期:2016-10-19 05:48:10
38#
发表于 2015-7-30 08:37 | 只看该作者
本帖最后由 阿吉2009 于 2015-7-30 08:57 编辑

SQL> create table t_timestamp
  2  (
  3    mydate timestamp(9)
  4  )
  5  ;
表已创建。
SQL> insert into t_timestamp select localtimestamp from dual;
已创建 1 行。
SQL> select to_char(mydate,'yyyy-mm-dd hh24:mi:ss.ff9') time from t_timestamp;
TIME                                                                                                                                                                                                   
----------------------------------------------------------                                                                                                                                             
2015-07-30 08:30:56.619671000                                                                                                                                                                           
SQL> insert into t_timestamp values (to_timestamp('2015-1-1 0:0:0.123456789', 'syyyy-mm-dd hh24:mi:ss.ff9'));
已创建 1 行。
SQL> select to_char(mydate,'yyyy-mm-dd hh24:mi:ss.ff9') time from t_timestamp;
TIME                                                                                                                                                                                                   
----------------------------------------------------------                                                                                                                                             
2015-07-30 08:30:56.619671000                                                                                                                                                                           
2015-01-01 00:00:00.123456789                                             
SQL> select * from t_timestamp;
MYDATE                                                                                                                                                                                                  
---------------------------------------------------------------------------                                                                                                                             
30-7月 -15 08.30.56.619671000 上午                                                                                                                                                                     
01-1月 -15 12.00.00.123456789 上午                                                                                                                                                                     
SQL> insert into t_timestamp select systimestamp from dual;
已创建 1 行。
SQL> select * from wangjin_timestamp;
MYDATE                                                                                                                                                                                                  
---------------------------------------------------------------------------                                                                                                                             
30-7月 -15 08.30.56.619671000 上午                                                                                                                                                                     
01-1月 -15 12.00.00.123456789 上午                                                                                                                                                                     
30-7月 -15 08.41.53.478498000 上午                                                                                                                                                                     

使用道具 举报

回复
论坛徽章:
30
生肖徽章:猴
日期:2015-03-20 10:13:49ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:31优秀写手
日期:2015-03-07 06:00:14沸羊羊
日期:2015-03-13 13:26:07美羊羊
日期:2015-04-06 20:32:13天蝎座
日期:2015-07-20 12:34:47射手座
日期:2015-09-18 12:38:55乌索普
日期:2016-08-03 07:04:28奥运会纪念徽章:手球
日期:2016-09-26 07:19:26山治
日期:2016-10-19 05:48:10
39#
发表于 2015-7-30 08:52 | 只看该作者
SQL> select * from v$version;

BANNER                                                                                                                                                                                                  
----------------------------------------------------------------------------------------------------------------------------------------------------------------                                       
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production                                                                                                                           
PL/SQL Release 11.2.0.3.0 - Production                                                                                                                                                                  
CORE        11.2.0.3.0        Production                                                                                                                                                                              
TNS for Linux: Version 11.2.0.3.0 - Production                                                                                                                                                         
NLSRTL Version 11.2.0.3.0 - Production   

也就是说ORACLE的timestamp可精确到9位,但ORACLE取时间的函数也是调用OS的取时间函数,而LINUX只能精确到6位,所以也只能如此了。这个在O'REILLY出版的《ORACLE PL/SQL程序设计》中有说明。

使用道具 举报

回复
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
40#
 楼主| 发表于 2015-7-30 09:32 | 只看该作者
阿吉2009 发表于 2015-7-30 08:52
SQL> select * from v$version;

BANNER                                                              ...

老兄好久不见了啊。
你的意思是否是说:
1、时间精度取决于操作系统。LINUX的系统可获得秒后6位精度的时间值,WINDOWS的系统可获得秒后3位精度的时间值(此点,请在WINDOWS下安装数据库的网友帮忙验证一下。)
2、字段的数据类型只决定可保存的数据精度。以本例来说,当你设置timestamp(9)时,意为可以保存纳秒级的数据,即秒的小数点后可以到9位。但系统能否产生这个精度的数据,是另外一回事儿了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表