度量快速开发平台-专业、快速的软件定制快开平台

标题: ORACLE如何获取年、月、日(Extract函数) [打印本页]

作者: 万望    时间: 2020-6-17 15:25
标题: ORACLE如何获取年、月、日(Extract函数)
本帖最后由 万望 于 2016-1-17 15:56 编辑

在ORACLE中,要获得日期中的年份,例如把sysdate中的年份取出来,并不是一件难事。常用的方法是:Selectto_number(to_char(sysdate,'yyyy')) from dual,而实际上,oracle本身有更好的方法,那就是使用Extract函数,使用方法是:Select Extract(year fromsysdate) from dual,此方法获得的结果,是数值型的,这种方法省掉了类型转换,更加简洁。
相应的,要取得月份或日,可以用select extract (month from sysdate) from dual和select extract (day from sysdate) from dual。
Oracle EXTRACT函数
EXTRACT内置函数,可以处理DATATIME和INTERVAL,并从中返回各部分信息,如从TIMESTAMP返回时区,从INTERVAL返回小时/天/分钟

语法如下:
EXTRACT(YEAR|MONTH|DAY|HOUR|MINUTE|SECOND|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TIMEZONE_ABBRFROM expr)

1、如果返回年或月,FROM后面的expr必须是以下类型:
DATE,TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, orINTERVAL YEAR TO MONTH.

2、如果返回DAY,FROM后面的expr必须是以下类型:
DATE, TIMESTAMP, TIMESTAMP WITHTIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, or INTERVAL DAY TO SECOND.

3、如果返回时分秒,FROM后面的expr必须是以下类型:
TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE,or INTERVAL DAY TO SECOND.

DATE类型是无效的,因为Oracle数据库把DATA类型处理为ASCI DATE,并无time可用。

4、如果返回TIMEZONE_HOUR, TIMEZONE_MINUTE, TIMEZONE_ABBR,TIMEZONE_REGION, or TIMEZONE_OFFSET,FROM后面的expr必须是以下类型:TIMESTAMP WITH TIME ZONE orTIMESTAMP WITH LOCAL TIME ZONE.
EXTRACT提取的表达式是一个ASCI的日期时间类型,而非Oracle自有的DATE类型,也就是说,只能从DATE类型的数据里面提取年、月、日。
  1. select hiredate ,
  2. extract(year from hiredate) as year,
  3. extract(month from hiredate) as month,
  4. extract(day from hiredate) as day  from emp;

  5. select extract(hour from hiredate) as hour  from emp;
  6. --从date类型的数据里取hour、minute、second会报错。
  7. SQL> select extract(hour from hiredate) as hour  from emp;
  8. select extract(hour from hiredate) as hour  from emp
  9.                          *
  10. ERROR at line 1:
  11. ORA-30076: invalid extract field for extract source

  12. --timestamp示例
  13.         select dt2-dt1
  14.      from (select to_timestamp('29-feb-2000 01:02:03.122000',
  15.                                'dd-mon-yyyy hh24:mi:ss.ff') dt1,
  16.                   to_timestamp('15-mar-2001 11:22:33.000000',
  17.                                'dd-mon-yyyy hh24:mi:ss.ff') dt2
  18.              from dual );

  19. DT2-DT1
  20. ---------------------------------------------------------------------------
  21. +000000380 10:20:29.878000000

  22. --返回了380天,10小时,20分钟,29.878秒
  23. --而用EXTRACT更轻松
  24. select extract(day from dt2 - dt1) day,
  25.         extract(hour from dt2 - dt1) hour,
  26.         extract(minute from dt2 - dt1) minute,
  27.         extract(second from dt2 - dt1) second
  28.    from (select to_timestamp('29-feb-2000 01:02:03.122000',
  29.                              'dd-mon-yyyy hh24:mi:ss.ff') dt1,
  30.                 to_timestamp('15-mar-2001 11:22:33.000000',
  31.                              'dd-mon-yyyy hh24:mi:ss.ff') dt2
  32.            from dual);

  33.        DAY         HOUR          MINUTE     SECOND
  34. ---------- ---------- ---------- ----------
  35.        380           10              20     29.878
复制代码
因此这就为从日期类型的数据中抽取部分数据又多了一种选择:
  1. SQL> select extract(year from sysdate) from dual;

  2. EXTRACT(YEARFROMSYSDATE)
  3. ------------------------
  4.                     2014

  5. SQL> select to_char(sysdate,'yyyy') from dual;

  6. TO_C
  7. ----
  8. 2014

  9. SQL> select to_char(sysdate,'YEAR') from dual;

  10. TO_CHAR(SYSDATE,'YEAR')
  11. ------------------------------------------
  12. TWENTY FOURTEEN
复制代码








作者: 万望    时间: 2020-6-17 15:59
extract这个函数oracle 9i才有的,有了它抽取日期类型数据更方便
作者: 陈晓龙    时间: 2020-6-18 11:15
万望 发表于 2016-1-17 15:59
extract这个函数oracle 9i才有的,有了它抽取日期类型数据更方便

过时了没,oracle 9
作者: 张兴康    时间: 2020-6-18 11:30
万望 发表于 2016-1-17 15:59
extract这个函数oracle 9i才有的,有了它抽取日期类型数据更方便

是只有oracle 9i才有,还是oracle9i之后版本都有
作者: 王爱东    时间: 2020-6-18 17:31
这个函数我没用过 ,找时间用用。还不错。
作者: 万望    时间: 2020-6-18 23:26
张兴康 发表于 2016-1-18 11:30
是只有oracle 9i才有,还是oracle9i之后版本都有

我的意思是从9I版本开始有的,怎么过时?
作者: 万望    时间: 2020-6-18 23:28
取年份、月份、号想到方便
作者: 张兴康    时间: 2020-6-20 15:07
万望 发表于 2016-1-18 23:26
我的意思是从9I版本开始有的,怎么过时?

我没说过时啊?
作者: 万望    时间: 2020-6-20 23:49
张兴康 发表于 2016-1-20 15:07
我没说过时啊?


作者: 张兴康    时间: 2020-6-21 18:42
万望 发表于 2016-1-20 23:49







欢迎光临 度量快速开发平台-专业、快速的软件定制快开平台 (http://bbs.delit.cn/) Powered by Discuz! X3.2