设为首页 收藏本站
查看: 383|回复: 0

[经验分享] oracle日期时间函数总结

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-5-23 09:30:09 | 显示全部楼层 |阅读模式
经常写 sql 的同学应该会接触到一些 oracle 的日期时间函数, 例如: 财务软件或者人力资源软件需要按照每年, 每季度, 每月, 甚至每个星期来进行统计.

今天闲来没事, 特意从网上整理了一些资料, 以备日后查阅.


一、常用日期数据格式

1. 获取年的最后一位, 两位, 三位, 四位

   select to_char(sysdate,'Y') from dual;    -- 获取年的最后一位

   select to_char(sysdate,'YY') from dual;    -- 获取年的最后两位

   select to_char(sysdate,'YYY') from dual;    -- 获取年的最后三位

   select to_char(sysdate,'YYYY') from dual;    -- 获取年的最后四位


2. 获取当前季度

   select to_char(sysdate,'Q') from dual;    -- 1 ~ 3月为第一季度, 2表示第二季度。


3. 获取月份数

   select to_char(sysdate,'MM') from dual;    -- 五月为05


4. 获取月份的罗马表示

   select to_char(sysdate,'RM') from dual;    -- 五月为V


5. 获取用9个字符长度表示的月份名  

   select to_char(sysdate,'Month') from dual;    -- 五月为5月


6. 获取当年第几周

   select to_char(sysdate,'WW') from dual;    -- 2014年5月20日为2014年第20周


7. 获取本月第几周

   select to_char(sysdate,'W') from dual;    -- 2014年5月20日为5月第3周


8. 获取当年第几天

   select to_char(sysdate,'DDD') from dual;    -- 2014年5月20日为2014年第140天


9. 获取当月第几天

   select to_char(sysdate,'DD') from dual;    -- 2014年5月20日为5月第20天


10. 获取一周第几天

   select to_char(sysdate,'D') from dual;    -- 2014年5月20日为一周第三天( 从周日算起 )


11. 获取中文的星期

   select to_char(sysdate,'DY') from dual;    -- 2014年5月20日为星期二


12. 获取12进制小时数

   select to_char(sysdate,'HH') from dual;    -- 22:36分用12小时制计时为10点


13. 获取24进制小时数

   select to_char(sysdate,'HH24') from dual;    -- 22:36分用24小时制计时为22点


二、常用时间函数

1. trunc(d, [ ? ])



    select sysdate S1, -- 返回当前日期,有时分秒  
           trunc(sysdate) S2, -- 返回当前日期,无时分秒  
           trunc(sysdate, 'year') YEAR, -- 返回当前年的1月1日,无时分秒  
           trunc(sysdate, 'month') MONTH, -- 返回当前月的1日,无时分秒  
           trunc(sysdate, 'day') DAY, -- 返回当前星期的星期天,无时分秒  
           trunc(sysdate, 'Q') QUARTER, -- 返回当前季度的1日,无时分秒  
           trunc(sysdate, 'D') WEEK -- 返回当前星期的星期天,无时分秒  
      from dual  


2. round(d, [?]) 舍入到最接近的日期



    select sysdate S1,  
           round(sysdate) S2,  
           round(sysdate, 'year') YEAR, -- 舍入到最接近的年 2014/1/1  
           round(sysdate, 'month') MONTH, -- 舍入到最接近的月 2014/6/1  
           round(sysdate, 'day') DAY -- 舍入到最接近的星期日 2014/5/18  
      from dual  


3. last_day(d)  获取包含d的月最后一天的日期
   select last_day(sysdate) from dual;    -- 获取本月最后一天: 2014/5/31 22:46:01


4. add_months(d, n) 日期d往后推n个月

   select add_months(sysdate,2) from dual;    -- 日期往后推2个月: 2014/7/20 22:49:36


5. next_day(d, day)

   select next_day(sysdate,2) from dual;    -- 日期sysdate之后的第一周中, 指定星期的第2天是什么日期


6. months_between(f,s) 日期f和s间相差月数

   select months_between(sysdate,to_date('2007-04-12','yyyy-mm-dd'))from dual;    -- 85.2889874551971


7. 获取两个日期间的天数

   select floor(sysdate - to_date('20140405','yyyymmdd')) from dual;


三、综合用法

1. 获取上个月最后一天

   select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') lastDay from dual;


2. 获取上个月的今天

   select to_char(add_months(sysdate,-1),'yyyy-MM-dd') preToday from dual;


3. 获取上个月的第一天

   select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;


4. 获取某月中所有周五的具体日期



    select to_char(b.a, 'YY-MM-DD')  
      from (select trunc(sysdate, 'mm') + rownum - 1 a  
              from dba_objects  
             where rownum < 32) b  
     where to_char(b.a, 'day') = '星期五';  


5. 查找2002-02-28至2002-02-01间除了星期一和七的天数



    select count(*)  
      from (select rownum - 1 row_num  
              from all_objects  
             where rownum <= to_date('2002-02-28', 'yyyy-mm-dd') -  
                   to_date('2002-02-01', 'yyyy-mm-dd') + 1)  
     where to_char(to_date('2002-02-01', 'yyyy-mm-dd') + row_num - 1, 'D') not in('1', '7')  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-19523-1-1.html 上篇帖子: Oracle 事物隔离级别 下篇帖子: RMAN-08138 oracle
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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