oracle数据库 极光,oracle timestamp(6)运用

我们都知道date和timestamp都是对日期和时间的表示,只是两种类型的精确度不同,前者精确到秒,后者精确到小数秒(fractional_seconds_precision),可以是

0 to 9,缺省是6。

但是对date类型的运算很简单,有很多函数可用来处理;而两个timestamp的差则是很直观地显示为多少天+多少小时+多少分钟+多少秒+多少小数秒,

SQL> create table test (T1 TIMESTAMP(6),

2 T2 TIMESTAMP(6));

表已创建。

SQL> insert into test values(

2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd

hh24:mi:ss.ff'),

3 to_timestamp('2006-01-01 12:20:10.2','yyyy-mm-dd

hh24:mi:ss.ff'));

已创建 1 行。

SQL>

SQL> insert into test values(

2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd

hh24:mi:ss.ff'),

3 to_timestamp('2006-01-02 12:20:10.2','yyyy-mm-dd

hh24:mi:ss.ff'));

已创建 1 行。

SQL>

SQL> insert into test values(

2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd

hh24:mi:ss.ff'),

3 to_timestamp('2006-01-02 13:40:20.2','yyyy-mm-dd

hh24:mi:ss.ff'));

已创建 1 行。

SQL> commit;

提交完成。

SQL>

两个timestamp的差则是很直观地显示为多少天+多少小时+多少分钟+多少秒+多少小数秒:

SQL> select t2-t1 from test;

+000000000 00:10:00.100000

+000000001 00:10:00.100000

+000000001 01:30:10.100000

SQL>

但要简单地转化为某一个精度却比较麻烦,用类似date类型的处理方法是不行的。如转化为分:

SQL> select 1440*(t2-t1) from test;

+000000010 00:02:24.000000000

+000001450 00:02:24.000000000

+000001530 04:02:24.000000000

SQL>

发现结果根本不是原先想要的,而是在原先的“多少天+多少小时+多少分钟+多少秒+多少小数秒”的每一项都乘以1440再进行进制处理。

最容易理解的就是用substr将两个timestamp的差进行分割转化处理:

SQL>  SELECT substr((t2-t1),instr((t2-t1),'

')+7,2)         seconds,

2      substr((t2-t1),instr((t2-t1),' ')+4,2)

minutes,

3     substr((t2-t1),instr((t2-t1),' ')+1,2)

hours,

4     trunc(to_number(substr((t2-t1),1,instr(t2-t1,' '))))

days,

5     trunc(to_number(substr((t2-t1),1,instr(t2-t1,' ')))/7)

weeks

6 FROM test;

SECO MINU HOUR DAYS WEEKS

---- ---- ---- ---------- ----------

00 10 00 0 0

00 10 00 1 0

10 30 01 1 0

或者利用自定义函数来实现将天数转换成“天时分秒”格式:

CREATE OR REPLACE FUNCTION F_DAYS2STR(P_DAYS IN NUMBER

DEFAULT 0)

RETURN VARCHAR2 IS--Ver:1.0--Created by xsb on

2005-05-26--For:

将天数转换成天时分秒格式DAYS NUMBER := NVL(P_DAYS, 0);

VD NUMBER; --天VH NUMBER; --小时VM NUMBER; --分VS NUMBER; --秒RESULT VARCHAR2(100); --返回值BEGIN

VD := TRUNC(DAYS);

VH := TRUNC((DAYS - VD) * 24);

VM := TRUNC((DAYS - VD - VH / 24)

* 24 * 60);

VS := TRUNC((DAYS - VD - VH / 24 - VM

/ 24 / 60) *

24 * 60 * 60);

SELECT DECODE(VD, 0, '', VD

|| '天') ||

DECODE(VH, 0, '', VH

|| '小时')

||DECODE(VM, 0, '', VM

|| '分') ||

DECODE(VS, 0, '', VS

|| '秒') INTO

RESULT FROM DUAL;

RETURN(RESULT);

END;

SQL>

如果最后结果的精度要求不高时(在分或分以上时),就可以先将timestamp转化为date再结算,这样就简单多了:

SQL> select (to_date(to_char(t2,'yyyy-mm-dd

hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'

)-to_date(to_char(t1,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd

hh24:mi:ss'))*24*60

2 from test;

10

1450

1530.16667

date转换为timestamp:

SELECT CAST(sysdate

AS TIMESTAMP) from dual;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值