C/C++教程

ORACLE 日期函数及字符函数总结

本文主要是介绍ORACLE 日期函数及字符函数总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一 说明

为帮助大家快速查询oracle系统的功能,整理了日期函数,分组函数,分析函数和其他一部分功能,希望对大家有些帮助。

二.日期函数处理

1.   格式说明

格式

解释

示例

yy

两位年

09

yyy

三位年

009

yyyy

四位年

2009

mm

两位月

01

mon

文字表达

1月或者 Jan

month

文字全表达

1月或者January

dd

单月第几天

01

ddd

当年第几天

01

dy

周几

周二或者Fri

day

周几全称

周二或者Friday

hh

12小时制

02

hh24

24小时制

02

mi

分钟

04

ss

05

WW

当年第几周

01

W

单月第几周

01

Q

季度

01

2.  日期基本函数

a)  TO_CHAR(THEDATE,FMT)
日期转换成字符,参照上面的格式转换,其中sysdate是系统时间
  selectto_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   --日期转化为字符串 

select to_char(sysdate,'yyyy') asnowYear   from dual;   --获取时间的年 select to_char(sysdate,'mm')    as nowMonth from dual;   --获取时间的月 select to_char(sysdate,'dd')    as nowDay   from dual;   --获取时间的日 select to_char(sysdate,'hh24') asnowHour   from dual;   --获取时间的时 select to_char(sysdate,'mi')    as nowMinute from dual;   --获取时间的分 select to_char(sysdate,'ss')    as nowSecond from dual;   //获取时间的秒

b)  TO_DATE(THESTRING,FMT)

 

select to_date('2006-05-07 13:23:44','yyyy-mm-ddhh24:mi:ss')  from dual 转换成字符select to_date('2006-05-07 13:23:44','Q') from dual 

3.求某天是星期几     

 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;   

   星期一     

 select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE =American') from dual;      

   monday     
   设置日期语言     

   ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';     

   也可以这样     

  TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE =American')    

4.两个日期间的天数       

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

      二个日期直接相减,得出的是相差的天数    

5. 时间为null的用法     

  select id, active_date from table1         UNION         select 1, TO_DATE(null) from dual; 

 
   注意要用TO_DATE(null)    

6.月份差  

 a_date between to_date('20011201','yyyymmdd') andto_date('20011231','yyyymmdd')  

   
   那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。     
   所以,当时间需要精确的时候,觉得to_char还是必要的
     
7. 日期格式冲突问题     
    输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'     
   

 alter system set NLS_DATE_LANGUAGE =American          alter session set NLS_DATE_LANGUAGE =American 

    
    或者在to_date中写     
   

selectto_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE =American') from dual;

     
    注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,     
    可查看     
   

select * fromnls_session_parameters          select * from V$NLS_PARAMETERS 

   

8.    

select count(*)         from ( select rownum-1 rnum             fromall_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')+rnum-1, 'D')              not in ( '1', '7')  

   
  
   查找2002-02-28至2002-02-01间除星期一和七的天数     
   在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒).    

9. 查找月份   

 select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY'))"MONTHS" FROM DUAL;          1   
 selectmonths_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY'))"MONTHS" FROM DUAL;          1.03225806451613 

      
10.  next_day (sysdate,day)

   返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日
   next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。     
   1 2 3 4 5 6 7     
   日 一 二 三 四 五 六   
 

select NEXT_DAY(sysdate, 6 ) fromdual  11.获得小时数   extract()找出日期或间隔值的字段值

  SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40')from offer          SQL> select sysdate ,to_char(sysdate,'hh') fromdual;              SYSDATE TO_CHAR(SYSDATE,'HH')          -----------------------------------------          2003-10-13 19:35:21 07              SQL> select sysdate ,to_char(sysdate,'hh24') fromdual;              SYSDATETO_CHAR(SYSDATE,'HH24')          -------------------------------------------          2003-10-13 19:35:21 19 

   

      
12.年月日的处理    

   select older_date,             newer_date,             years,             months,             abs(              trunc(             newer_date-               add_months(older_date,years*12+months )              )             ) days           from ( select              trunc(months_between( newer_date,older_date )/12) YEARS,              mod(trunc(months_between(newer_date, older_date )),12 ) MONTHS,             newer_date,             older_date              from (              select hiredate older_date, add_months(hiredate,rownum)+rownumnewer_date                   from emp             )            )    

13.处理月份天数不定的办法     
 

  select to_char(add_months(last_day(sysdate) +1, -2),'yyyymmdd'),last_day(sysdate) from dual

    

14.找出今年的天数    

  select add_months(trunc(sysdate,'year'), 12) -trunc(sysdate,'year') from dual    

   闰年的处理方法     
 

 select  to_char( last_day(to_date('021998','mmyyyy') ), 'dd' )    from dual   

  
   如果是28就不是闰年,以上1998改成你要的年费就可以了    

15.yyyy与rrrr的区别     
   'YYYY99 TO_C     
   ------- ----     
   yyyy 99 0099     
   rrrr 99 1999     
   yyyy 01 0001     
   rrrr 01 2001    

16.不同时区的处理     
 

  select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyyhh:mi:ss') ,sysdate  from dual;    

17.5秒钟一个间隔     
 

Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS'),TO_CHAR(sysdate,'SSSSS')         from dual    
   2002-11-1 9:55:00 35786         SSSSS表示5位秒数  

  

18.一年的第几天     
 

 select TO_CHAR(SYSDATE,'DDD'),sysdate from dual   310 2002-11-6 10:03:51  

  

19.计算小时,分,秒,毫秒    

   select           Days,           A,           TRUNC(A*24) Hours,           TRUNC(A*24*60 - 60*TRUNC(A*24))Minutes,           TRUNC(A*24*60*60 - 60*TRUNC(A*24*60))Seconds,           TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60))mSeconds          from          (           select           trunc(sysdate) Days,           sysdate - trunc(sysdate)A           from dual         )    
   select * fromtabname         order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');           //         floor((date2-date1) /365) 作为年         floor((date2-date1, 365) /30) 作为月        d(mod(date2-date1, 365), 30)作为日.

    
20,round[舍入到最接近的日期](day:舍入到最接近的星期日)

 

 select sysdate S1,   round(sysdate) S2 ,   round(sysdate,'year') YEAR,   round(sysdate,'month') MONTH ,   round(sysdate,'day') DAY from dual

21,trunc[截断到最接近的日期,单位为天] ,返回的是日期类型
 

select sysdateS1,                         trunc(sysdate)S2,                //返回当前日期,无时分秒     trunc(sysdate,'year')YEAR,        //返回当前年的1月1日,无时分秒     trunc(sysdate,'month') MONTH ,    //返回当前月的1日,无时分秒     trunc(sysdate,'day')DAY           //返回当前星期的星期天,无时分秒   from dual

22,返回日期列表中最晚日期 

 select greatest('01-1月-04','04-1月-04','10-2月-04') from dual

23.计算时间差
     注:oracle时间差是以天数为单位,所以换算成年月,日   

 

       selectfloor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-ddhh24:mi:ss'))/365) as spanYears from dual       //时间差-年      selectceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-ddhh24:mi:ss'))) as spanMonths fromdual        //时间差-月      selectfloor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-ddhh24:mi:ss'))) as spanDays fromdual             //时间差-天      selectfloor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-ddhh24:mi:ss'))*24) as spanHours fromdual         //时间差-时      selectfloor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60)as spanMinutes from dual    //时间差-分      selectfloor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-ddhh24:mi:ss'))*24*60*60) as spanSeconds from dual //时间差-秒 
24.更新时间     注:oracle时间加减是以天数为单位,设改变量为n,所以换算成年月,日     select to_char(sysdate,'yyyy-mm-ddhh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime fromdual        //改变时间-年     select to_char(sysdate,'yyyy-mm-ddhh24:mi:ss'),add_months(sysdate,n) as newTime fromdual                                //改变时间-月     select to_char(sysdate,'yyyy-mm-ddhh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime fromdual            //改变时间-日     select to_char(sysdate,'yyyy-mm-ddhh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime fromdual         //改变时间-时     select to_char(sysdate,'yyyy-mm-ddhh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime fromdual      //改变时间-分     select to_char(sysdate,'yyyy-mm-ddhh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTimefrom dual   //改变时间-秒

25.查找月的第一天,最后一天

SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH')First_Day_Last_Month, Trunc(SYSDATE, 'MONTH') - 1 / 86400Last_Day_Last_Month, Trunc(SYSDATE, 'MONTH')First_Day_Cur_Month, LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1/ 86400 Last_Day_Cur_Month FROM dual;


三. 字符函数(可用于字面字符或数据库列)

1,字符串截取
   select substr('abcdef',1,3) from dual

2,查找子串位置

  select instr('abcfdgfdhd','fd') from dual

3,字符串连接

  select 'HELLO'||'hello world' from dual;

4, 1)去掉字符串中的空格

select ltrim(' abc') s1,    rtrim('zhang ') s2,    trim(' zhang ') s3 from dual

   2)去掉前导和后缀

 select trim(leading 9 from 9998767999) s1,    trim(trailing 9 from 9998767999) s2,    trim(9 from 9998767999) s3 from dual;

  
5,返回字符串首字母的Ascii值

  select ascii('a') from dual

6,返回ascii值对应的字母

  select chr(97) from dual

7,计算字符串长度

  select length('abcdef') from dual

8,initcap(首字母变大写) ,lower(变小写),upper(变大写)

 select lower('ABC') s1,        upper('def') s2,        initcap('efg') s3   from dual;

9,Replace

 select replace('abc','b','xy') from dual;

10,translate

  select translate('abc','b','xx') from dual; -- x是1位

11,lpad [左添充] rpad [右填充](用于控制输出格式)

  select lpad('func',15,'=') s1, rpad('func',15,'-') s2 from dual;   select lpad(dname,14,'=') from dept;

12, decode[实现if ..then 逻辑]   注:第一个是表达式,最后一个是不满足任何一个条件的值

  select deptno,decode(deptno,10,'1',20,'2',30,'3','其他') from dept;   例:   select seed,account_name,decode(seed,111,1000,200,2000,0) fromt_userInfo//如果

seed为111,则取1000;为200,取2000;其它取0

 select seed,account_name,decode(sign(seed-111),1,'bigseed',-1,'little seed','equal seed') from t_userInfo//如果seed>111,则显示大;为200,则显示小;其它则显 
示相等

13 case[实现switch ..case 逻辑] 

 SELECT CASE X-FIELD          WHEN X-FIELD < 40 THEN'X-FIELD 小于 40'         WHEN X-FIELD < 50 THEN'X-FIELD 小于 50'         WHEN X-FIELD < 60 THEN'X-FIELD 小于 60'         ELSE 'UNBEKNOWN'        END   FROM DUAL 

  注:CASE语句在处理类似问题就显得非常灵活。当只是需要匹配少量数值时,用Decode更为简洁。

四.数字函数
1,取整函数(ceil 向上取整,floor 向下取整)
 

  select ceil(66.6) N1,floor(66.6) N2 from dual;

2, 取幂(power) 和 求平方根(sqrt)

  select power(3,2) N1,sqrt(9) N2 from dual;

3,求余

   select mod(9,5) from dual;

4,返回固定小数位数 (round:四舍五入,trunc:直接截断)

  select round(66.667,2) N1,trunc(66.667,2) N2 from dual;

5,返回值的符号(正数返回为1,负数为-1)

  select sign(-32),sign(293) from dual;

五.转换函数
1,to_char()[将日期和数字类型转换成字符类型]

 1) select to_char(sysdate) s1,        to_char(sysdate,'yyyy-mm-dd') s2,        to_char(sysdate,'yyyy') s3,        to_char(sysdate,'yyyy-mm-ddhh12:mi:ss') s4,        to_char(sysdate, 'hh24:mi:ss') s5,        to_char(sysdate,'DAY') s6     from dual;   2) select sal,to_char(sal,'$99999')n1,to_char(sal,'$99,999') n2 from emp

2, to_date()[将字符类型转换为日期类型]

  insert into emp(empno,hiredate)values(8000,to_date('2004-10-10','yyyy-mm-dd'));

 3, to_number() 转换为数字类型

   select to_number(to_char(sysdate,'hh12')) from dual; //以数字显示的小时数

  
六.其他函数
   1.user:
    返回登录的用户名称

   select user from dual;

   2.vsize:
    返回表达式所需的字节数

   select vsize('HELLO') from dual;

  
   3.nvl(ex1,ex2):  
    ex1值为空则返回ex2,否则返回该值本身ex1(常用)
    例:如果雇员没有佣金,将显示0,否则显示佣金

   select comm,nvl(comm,0) from emp;

     4.nullif(ex1,ex2):
    值相等返空,否则返回第一个值
    例:如果工资和佣金相等,则显示空,否则显示工资

  select nullif(sal,comm),sal,comm from emp;

   5.coalesce:  
    返回列表中第一个非空表达式  

select comm,sal,coalesce(comm,sal,sal*10) from emp;

  
   6.nvl2(ex1,ex2,ex3) :
    如果ex1不为空,显示ex2,否则显示ex3
    如:查看有佣金的雇员姓名以及他们的佣金       

select nvl2(comm,ename,') as HaveCommName,comm from emp;

  
  
七.分组函数
max min avg count sum
1,整个结果集是一个组
   1) 求部门30 的最高工资,最低工资,平均工资,总人数,有工作的人数,工种数量及工资总和   

 select max(ename),max(sal),      min(ename),min(sal),     avg(sal),     count(*) ,count(job),count(distinct(job)) ,     sum(sal) from emp where deptno=30;

2, 带group by 和 having 的分组
   1)按部门分组求最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和
   

select deptno, max(ename),max(sal),    min(ename),min(sal),    avg(sal),    count(*) ,count(job),count(distinct(job)) ,    sum(sal) from emp group by deptno;

  
   2)部门30的最高工资,最低工资,总人数,有工作的人数,工种数量及工资总和
   

select deptno, max(ename),max(sal),    min(ename),min(sal),    avg(sal),    count(*) ,count(job),count(distinct(job)) ,    sum(sal) from emp group by deptno having deptno=30;

  
3, stddev 返回一组值的标准偏差
  

select deptno,stddev(sal) from emp group by deptno;    variance 返回一组值的方差差    select deptno,variance(sal) from emp group by deptno;

4, 带有rollup和cube操作符的Group By
    rollup 按分组的第一个列进行统计和最后的小计
    cube 按分组的所有列的进行统计和最后的小计
   

select deptno,job ,sum(sal) from emp group by deptno,job;    select deptno,job ,sum(sal) from emp group byrollup(deptno,job);

    cube 产生组内所有列的统计和最后的小计
   

 select deptno,job ,sum(sal) from emp group bycube(deptno,job);

八、临时表
   只在会话期间或在事务处理期间存在的表.
   临时表在插入数据时,动态分配空间
  

create global temporary table temp_dept   (dno number,   dname varchar2(10))   on commit delete rows;   insert into temp_dept values(10,'ABC');   commit;   select * from temp_dept; --无数据显示,数据自动清除   on commit preserve rows:在会话期间表一直可以存在(保留数据)   on commit delete rows:事务结束清除数据(在事务结束时自动删除表的数据)   

这篇关于ORACLE 日期函数及字符函数总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!