当前位置:  数据库>oracle

Oracle 时间类型及函数处理

    来源: 互联网  发布时间:2017-04-13

    本文导语: 一、date类型使用 而date类型相减只得到天数SQL> SELECT sysdate-(sysdate-1) FROM dual;SYSDATE-(SYSDATE-1)-------------------                  1  做个试验:create table t2 (d1 date,d2 date) ;--创建一个表INSERT INTO T2 VALUES (SYSDATE, SYSDATE + 1.1234); --插...

一、date类型使用

而date类型相减只得到天数
SQL> SELECT sysdate-(sysdate-1) FROM dual;
SYSDATE-(SYSDATE-1)
-------------------
                  1
 做个试验:
create table t2 (d1 date,d2 date) ;--创建一个表
INSERT INTO T2 VALUES (SYSDATE, SYSDATE + 1.1234); --插入一条数据

SQL> SELECT D1, D2, D2 - D1, CAST(D2 AS TIMESTAMP) - CAST(D1 AS TIMESTAMP) FROM T2;
D1          D2               D2-D1                  CAST(D2ASTIMESTAMP)-CAST(D1AST
----------- ----------- ---------- ---------------------------------------
2010-12-2 1 2010-12-3 1 1.12340277    +000000001 02:57:42.000000














date类型相减转换为天、时分秒
SQL> SELECT TO_NUMBER(SUBSTR(D21, 1, INSTR(D21, ' '))) D,
  2             SUBSTR(D21, INSTR(D21, ' ') + 1, 2) H,
  3             SUBSTR(D21, INSTR(D21, ' ') + 4, 2) M,
  4             SUBSTR(D21, INSTR(D21, ' ') + 7, 2) S
  5      FROM (SELECT CAST(D2 AS TIMESTAMP) - CAST(D1 AS TIMESTAMP) D21
  6             FROM T2) ;
         D H    M    S
---------- ---- ---- ----
         1 02   57   42











--两个date日期相减
select dt2 - dt1,
       months_between(dt2, dt1) months_btwn,
       numtodsinterval(dt2 - dt1, 'day') days,
       numtoyminterval(months_between(dt2, dt1), 'month') years_months
  from (select to_date('29-2-2000 01:02:03',
                            'dd-mm-yyyy hh24:mi:ss') dt1,
               to_date('15-3-2001 11:22:33',
                            'dd-mm-yyyy hh24:mi:ss') dt2
          from dual);











--转换为年,天时分秒
select numtoyminterval(months_between(dt2, dt1), 'month') years_months,
       numtodsinterval(dt2 -
                       add_months(dt1, trunc(months_between(dt2, dt1))),
                       'day') days_hours
  from (select to_date('29-2-2000 01:02:03', 'dd-mm-yyyy hh24:mi:ss') dt1,
               to_date('15-3-2001 11:22:33', 'dd-mm-yyyy hh24:mi:ss') dt2
          from dual);

二、timestamp类型









timestamp 语法:timestamp(n)
--当n=0时,与date长度一样
create table t (dt date,ts timestamp(0));
insert into t values (sysdate,systimestamp);
SQL> select dump(dt,10) dump,dump(ts,10) dump from t;
DUMP                                             DUMP
------------------------------------------   ---------------------------------------
Typ=12 Len=7: 120,110,12,4,14,10,10          Typ=180 Len=7: 120,110,12,4,14,10,10








--n为9
create table t (dt date,ts timestamp(9));
insert into t values (sysdate,systimestamp);
SQL> select dump(dt,10) dump,dump(ts,10) dump from t;
DUMP                                       DUMP
-----------------------------------  --------------------------------------------------------
Typ=12 Len=7: 120,110,12,4,14,7,41        Typ=180 Len=11: 120,110,12,4,14,7,41,11,37,100,192

SQL> select * from t;
DT          TS
----------- -----------------------------------
2010-12-4 1 04-12月-10 01.54.09.










625000000 下午  --n为9即秒后面保留的位数(625000000)

select dump(ts,16) dump from t;
Typ=180 Len=11: 78,6e,c,4,e,37,a,25,40,be,40
SQL> select to_number('2540be40','xxxxxxxx') from dual;
 
TO_NUMBER('2540BE40','XXXXXXXX')--将后四个字节转换为十进制
------------------------------
      







625000000                --后面四个字节就是秒小数点后面的数字
       

--timestamp 类型包括了所有DATE数据类型的年月日时分秒的信息,而且包括了小数秒的信息
SQL> SELECT sysdate,systimestamp FROM dual;

SYSDATE     SYSTIMESTAMP
----------- ---------------------------------------
2011-3-4 15 04-3月 -11 03.18.16.625000 下午 +08:00

timestamp直接进行加减时会隐式的转为date型
SQL> select systimestamp ts,systimestamp+1 dt from dual;
 
TS                                                 DT
--------------------------------------------  -----------
04-12月-10 10.40.00.265000 上午 +08:00         2010-12-5 1

解决隐式转换问题(仍保持timestamp类型)
SQL> select systimestamp ts,systimestamp+numtodsinterval(1,'day') dt from dual;
 
TS                                                       DT
-------------------------------------------- ----------------------------------------------
04-12月-10 10.42.46.515000 上午 +08:00             05-12月-10 10.42.46.515000000 上午 +08:00

两个timestamp相减
SQL> select dt2 - dt1
  2    from (select to_timestamp('29-2-2000 01:02:03.122000',
  3                              'dd-mm-yyyy hh24:mi:ss.ff') dt1,
  4                 to_timestamp('15-3-2001 11:22:33.000000',
  5                              'dd-mm-yyyy hh24:mi:ss.ff') dt2
  6            from dual);
 
DT2-DT1
---------------------------------------
+000000380 10:20:29.878000000

将其转换为具体的年、天时分秒
SQL> select numtoyminterval(months_between(dt2, dt1), 'month') years_months,
  2         dt2 - add_months(dt1, trunc(months_between(dt2, dt1))) days_hours
  3    from (select to_timestamp('29-2-2000 01:02:03.122000',
  4                              'dd-mm-yyyy hh24:mi:ss.ff') dt1,
  5                 to_timestamp('15-3-2001 11:22:33.000000',
  6                              'dd-mm-yyyy hh24:mi:ss.ff') dt2
  7            from dual);
 
YEARS_MONTHS                            DAYS_HOURS
--------------------------------------- ---------------------------------------
+000000001-00                           +000000015 10:20:30.000000000


 注:to_char函数支持date和timestamp,但是trunc却不支持TIMESTAMP数据类型
 SQL> select trunc(to_date('20100908','yyyymmdd') - to_date('20100907','yyyymmdd')) m from dual;
         M
----------
         1
--两个相减的timestamp类型不能用trunc
SQL> select trunc(to_timestamp('20100908','yyyymmdd') - to_timestamp('20100907','yyyymmdd')) m from dual;
 
select trunc(to_timestamp('20100908','yyyymmdd') - to_timestamp('20100907','yyyymmdd')) m from dual
 
























































ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 INTERVAL DAY TO SECOND


 to_char的使用:
 SQL> SELECT sysdate,systimestamp,to_char(systimestamp,'yyyymmdd hh24:mi:ssxff3') FROM dual;
 
SYSDATE     SYSTIMESTAMP                                             TO_CHAR(SYSTIMESTAMP,'YYYYMMDD'
----------- -------------------------------------------------------- ------------------------------
2010-12-2 1 02-12月-10 02.06.34.046000 下午 +08:00                       20101202 14:06:34.046

对于 timestamp类型的数据直接相减可以精确到秒以后
SQL> select systimestamp-systimestamp from dual;
SYSTIMESTAMP-SYSTIMESTAMP
---------------------------------------
+000000000 00:00:00.000000
        
三、interval year to month 类型的使用
















interval year to month 可以用numtoyminterval或to_yminterval函数替代
SQL> select numtoyminterval(5,'year') + numtoyminterval(2,'month') from dual;
 
NUMTOYMINTERVAL(5,'YEAR')+NUMT
---------------------------------------
+000000005-02

SQL> select numtoyminterval(5*12+2,'month') from dual;
 
NUMTOYMINTERVAL(5*12+2,'MONTH'
---------------------------------------
+000000005-02

SQL> select to_yminterval('5-2') from dual;
 
TO_YMINTERVAL('5-2')
---------------------------------------
+000000005-02

SQL> select interval '5-2' year to month from dual;
 
INTERVAL'5-2'YEARTOMONTH
---------------------------------------
+05-02


四、interval day to second 类型的使用


























interval day to second 可以用numtodsinterval或to_dsinterval替换使用
SQL> select numtodsinterval(10, 'day') + numtodsinterval(2, 'hour') +
  2         numtodsinterval(3, 'minute') + numtodsinterval(2.3312, 'second')

  3    from dual;
 
NUMTODSINTERVAL(10,'DAY')+NUMT
---------------------------------------
+000000010 02:03:02.331200000

SQL> select numtodsinterval(10*24*60*60+2*3600+3*60+2.3312, 'second') from dual;
 
NUMTODSINTERVAL(10*24*60*60+2*
---------------------------------------
+000000010 02:03:02.331200000

SQL> select to_dsinterval('10 02:03:02.3312') from dual;
 
TO_DSINTERVAL('1002:03:02.3312'
---------------------------------------
+000000010 02:03:02.331200000

SQL> select interval '10 02:03:02.3312' day to second from dual;
 
INTERVAL'1002:03:02.3312'DAYTO
---------------------------------------
+10 02:03:02.331200

五、时间函数


























ADD_MONTHS 函数
ADD_MONTHS函数将一个日期上加上一指定的月份数,所以,日期中的日将是不变的。然而,如果开始日期是某月的最后一天,那么,结果将会调整以使
返回值仍对应新的一月的最后一天。如果,结果月份的天数比开始月份的天数少,那么,也会向回调整以适应有效日期
select ADD_MONTHS(TO_DATE('15-11-1961','dd-mm-yyyy'),1) from dual; --1961-12-15
select ADD_MONTHS(TO_DATE('30-11-1961','dd-mm-yyyy'),1) from dual; --1961-12-31
select ADD_MONTHS(TO_DATE('31-1-1999','dd-mm-yyyy'),1) from dual;--1999-2-28

MONTHS_BETWEEN 函数
MONTHS_BETWEEN (x, y)用于计算x和y之间有几个月。如果x在日历中比y早,那么MONTHS_BETWEEN()就返回一个负数。
                   当x 和 y 之间的月份之差不是整月的时候,可以采用小数表示

NUMTODSINTERVAL()函数
NUMTODSINTERVAL(x, interval_unit)用于将以interval_unit指定的值为单位的数字x转换为一个INTERVAL DAY TO SECOND类型,
                                 interval_unit参数可以设置为DAY、 HOUR、MINUTE或SECOND。

NUMTOYMINTERVAL()函数
NUMTOYMINTERVAL(x, interval_unit)用于将以interval_unit指定的值为单位的数字x转换为一个INTERVAL YEAR TO MONTH类型,
                                 interval_unit参数可以设置为YEAR或MONTH。

















    
 
 

您可能感兴趣的文章:

  • Oracle 系统变量函数介绍
  • Oracle 系统变量函数用法指南
  • Oracle中decode函数的用法
  • Oracle round()函数与trunc()函数区别介绍
  • oracle中lpad函数的用法详解
  • MySQL实现类似Oracle中的decode()函数的功能
  • Oracle函数substr(str1, pos, [len])
  • Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
  • SQL中Charindex和Oracle中对应的函数Instr对比
  • apache通过php的oci函数读取Oracle(字符集ZHS16GBK)时,显示乱码,如何解决?
  • Oracle Max函数使用中出现的问题
  • oracle合并列的函数wm_concat的使用详解
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • c#中oracle to_date函数用法举例
  • Oracle 函数用法之decode
  • Oracle过程与函数的区别分析
  • Oracle层次查询和with函数的使用示例
  • oracle的nvl函数的使用介绍
  • c#中oracle的to_date函数使用方法
  • Oracle中nul()函数
  • ORACLE数据库常用字段数据类型介绍
  • oracle中的空类型与c语言的空类型相匹配吗?
  • 关于Oracle BLOB类型,一个String字符怎么写入BLOB字段?
  • Oracle中查看某列数据类型
  • 测试添加Oracle中Blob数据类型对象
  • jsp文件上传smartupload到oracle数据库中没有longblob的数据类型如何处理的?
  • oracle中 VARCHAR2是什么数据类型
  • 请问保存文章内容的字段应用什么类型的(oracle),急!!!
  • oracle中怎么没有boolean类型的字段?应该用什么代替?
  • 如何向oracle库中字段类型是date的添加数据
  • 请问:ORACLE中的数据取出来后,需不需要进行一定的转换才能变为C语言的数据类型啊?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在Redhat7.2+Oracle8i如果硬件配置中用P4处理器,对oracle的安装有没有影响(100分)
  • Oracle控制文件多元化处理
  • 关于ORACLE中执行批处理的问题
  • oracle删除文件后数据库启动不了的处理方法
  • MS Server和Oracle中对NULL处理的一些细节差异
  • ORACLE DATAGUARD中手工处理日志v$archive_GAP的方法
  • Oracle 10g中用FIRALL处理非连续数组
  • 重新安装主机后ORACLE DB的处理
  • 轻轻松松学会在Oracle中实现时间相加处理
  • Linux系统下导出ORACLE数据库出现Exporting questionable statistics.错误 处理
  • 处理Oracle数据库中杀不掉的锁
  • oracle 11g导出数据时报ORA 1455错误的处理方法
  • redhat 下 oracle proc 预处理总是留下 tpXXXXXX 的临时文件
  • Oracle时间精确到时、分、秒处理方案
  • 一次Oracle故障处理过程
  • Oracle 插入超4000字节的CLOB字段的处理方法
  • Oracle 10g中用FORALL处理非连续数组
  • Oracle对于死锁的处理方法
  • Oracle中关于处理小数点位数的几个函数
  • SQL Server和Oracle并行处理比较分析
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3