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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 2869|回复: 9
打印 上一主题 下一主题

[分享] ORACLE如何获取年、月、日(Extract函数)

[复制链接]

348

主题

3572

帖子

9731

积分

论坛元老

Rank: 8Rank: 8

积分
9731
跳转到指定楼层
楼主
发表于 2020-6-17 15:25:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 万望 于 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
复制代码







分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复

使用道具 举报

348

主题

3572

帖子

9731

积分

论坛元老

Rank: 8Rank: 8

积分
9731
沙发
 楼主| 发表于 2020-6-17 15:59:54 | 只看该作者
extract这个函数oracle 9i才有的,有了它抽取日期类型数据更方便

点评

是只有oracle 9i才有,还是oracle9i之后版本都有  详情 回复 发表于 2020-6-18 11:30
过时了没,oracle 9  详情 回复 发表于 2020-6-18 11:15
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
板凳
发表于 2020-6-18 11:15:28 | 只看该作者
万望 发表于 2016-1-17 15:59
extract这个函数oracle 9i才有的,有了它抽取日期类型数据更方便

过时了没,oracle 9
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
地板
发表于 2020-6-18 11:30:52 | 只看该作者
万望 发表于 2016-1-17 15:59
extract这个函数oracle 9i才有的,有了它抽取日期类型数据更方便

是只有oracle 9i才有,还是oracle9i之后版本都有
回复 支持 反对

使用道具 举报

198

主题

1313

帖子

3806

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3806
5#
发表于 2020-6-18 17:31:00 | 只看该作者
这个函数我没用过 ,找时间用用。还不错。
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9731

积分

论坛元老

Rank: 8Rank: 8

积分
9731
6#
 楼主| 发表于 2020-6-18 23:26:42 | 只看该作者
张兴康 发表于 2016-1-18 11:30
是只有oracle 9i才有,还是oracle9i之后版本都有

我的意思是从9I版本开始有的,怎么过时?

点评

我没说过时啊?  详情 回复 发表于 2020-6-20 15:07
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9731

积分

论坛元老

Rank: 8Rank: 8

积分
9731
7#
 楼主| 发表于 2020-6-18 23:28:56 | 只看该作者
取年份、月份、号想到方便
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
8#
发表于 2020-6-20 15:07:15 | 只看该作者
万望 发表于 2016-1-18 23:26
我的意思是从9I版本开始有的,怎么过时?

我没说过时啊?
回复 支持 反对

使用道具 举报

348

主题

3572

帖子

9731

积分

论坛元老

Rank: 8Rank: 8

积分
9731
9#
 楼主| 发表于 2020-6-20 23:49:03 | 只看该作者

若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复 支持 反对

使用道具 举报

542

主题

5916

帖子

1万

积分

作者

Rank: 7Rank: 7Rank: 7

积分
13589
10#
发表于 2020-6-21 18:42:07 | 只看该作者
回复 支持 反对

使用道具 举报

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

本版积分规则

手机版|小黑屋|玉祥公司客服-玉祥集团客服  本站关键词:快速开发平台

GMT+8, 2024-5-8 17:06 , Processed in 0.146983 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表