Oracle 字符串转换TIMESTAMP类型或Date类型 您所在的位置:网站首页 字符串转为时间戳 Oracle 字符串转换TIMESTAMP类型或Date类型

Oracle 字符串转换TIMESTAMP类型或Date类型

2024-06-07 10:55| 来源: 网络整理| 查看: 265

一、使用oracle函数:

TO_TIMESTAMP_TZ('2009-3-9 17:51:23.23 -05:00',    'YYYY-MM-D HH24:MI:SS.FF TZH:TZM')

TO_DATE(yourdate,'YYYY-MM-D HH24:MI:SS');    // 字符串转日期Date

T0_CHAR(yourdate,'YYYY-MM-D HH24:MI:SS');   // 日期Date转字符串

eg:

update t_fl_flownote set sendtime=TO_TIMESTAMP_TZ('2009-11-30 10:47:16','YYYY-MM-DD HH24:MI:SS')

to_date('2012-11-13', 'yyyy-mm-dd') TO_TIMESTAMP_TZ('2013-12-09 11.10.10.982000','YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')

二、转别人的日志

我们都知道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: 将天数转换成天时分秒格式 DAYSNUMBER := NVL(P_DAYS, 0); VDNUMBER; --天 VHNUMBER; --小时 VMNUMBER; --分 VSNUMBER; --秒 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;



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有