资讯动态

ORACLE常用日期函数与日期转换格式化函数

发布时间:2026/8/23 5:01:32 来源:尧图企业网站定制
ORACLE常用日期函数与日期转换格式化函数Year:yy two digits 两位年 显示值:07yyy three digits 三位年 显示值:007yyyy four digits 四位年 显示值:2007Month:mm number 两位月 显示值:11mon abbreviated 字符集表示 显示值:11月,若是英文版,显示novmonth spelled out 字符集表示 显示值:11月,若是英文版,显示novemberDay:dd number 当月第几天 显示值:02ddd number 当年第几天 显示值:02dy abbreviated 当周第几天简写 显示值:星期五,若是英文版,显示friday spelled out 当周第几天全写 显示值:星期五,若是英文版,显示fridayddspth spelled out, ordinal twelfthHour:hh two digits 12小时进制 显示值:01hh24 two digits 24小时进制 显示值:13Minute:mi two digits 60进制 显示值:45Second:ss two digits 60进制 显示值:25其它Q digit 季度 显示值:4WW digit 当年第几周 显示值:44W digit 当月第几周 显示值:124小时格式下时间范围为 0:00:00 - 23:59:59....12小时格式下时间范围为 1:00:00 - 12:59:59 ....获取当前日期和时间的函数sysdate systimestamp1. 日期和字符转换函数用法TO_CHAR(datetime , format)TO_DATE(character, format)TO_TIMESTAMP(character, format)TO_TIMESTAMP_TZ(character, format)以TO_DATE和TO_CHAR为例TO_DATE格式(2019-04-09 17:50:30, yyyMMdd hh24:mi:ss)select to_date(2004-05-07 13:23:44,yyyy-mm-dd hh24:mi:ss) from dualselect to_char(sysdate,yyyy-mm-dd hh24:mi:ss) as nowTime from dual; //日期转化为字符串select to_char(sysdate,yyyy) as nowYear 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) as nowHour from dual; //获取时间的时select to_char(sysdate,mi) as nowMinute from dual; //获取时间的分select to_char(sysdate,ss) as nowSecond from dual; //获取时间的秒select to_char( to_date(222,J),Jsp) from dual //显示Two Hundred Twenty-Two2.求某天是星期几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_LANGUAGEAMERICAN;也可以这样TO_DATE (2002-08-26, YYYY-mm-dd, NLS_DATE_LANGUAGE American)3. 两个日期间的天数select floor(sysdate - to_date(20020405,yyyymmdd)) from dual;4. 时间为null的用法select id, active_date from table1 UNION select 1, TO_DATE(null) from dual; //注意要用TO_DATE(null)5.月份差a_date between to_date(20011201,yyyymmdd) and to_date(20011231,yyyymmdd)那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。所以当时间需要精确的时候觉得to_char还是必要的6. 日期格式冲突问题输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: 01-Jan-01alter system set NLS_DATE_LANGUAGE Americanalter session set NLS_DATE_LANGUAGE American或者在to_date中写select to_char(to_date(2002-08-26,yyyy-mm-dd),day,NLS_DATE_LANGUAGE American) from dual;注意我这只是举了NLS_DATE_LANGUAGE当然还有很多可查看select * from nls_session_parametersselect * from V$NLS_PARAMETERS7. 查询天数select count(*) from ( select rownum-1 rnum 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)rnum-1, D ) not in ( 1, 7 )查找2002-02-28至2002-02-01间除星期一和七的天数在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒).8. 查找月份select months_between(to_date(01-31-1999,MM-DD-YYYY),to_date(12-31-1998,MM-DD-YYYY)) MONTHS FROM DUAL; //1select months_between(to_date(02-01-1999,MM-DD-YYYY),to_date(12-31-1998,MM-DD-YYYY)) MONTHS FROM DUAL; //1.032258064516139. Next_day的用法Next_day(date, day)Monday-Sunday, for format code DAYMon-Sun, for format code DY1-7, for format code D10.select to_char(sysdate,hh:mi:ss) TIME from all_objects注意第一条记录的TIME 与最后一行是一样的可以建立一个函数来处理这个问题create or replace function sys_date return date isbeginreturn sysdate;end;select to_char(sys_date,hh:mi:ss) from all_objects;11.获得小时数extract()找出日期或间隔值的字段值SELECT EXTRACT(HOUR FROM TIMESTAMP 2001-02-16 2:38:40) from offerSQL select sysdate ,to_char(sysdate,hh) from dual;SYSDATE TO_CHAR(SYSDATE,HH)-------------------- ---------------------2003-10-13 19:35:21 07SQL select sysdate ,to_char(sysdate,hh24) from dual;SYSDATE TO_CHAR(SYSDATE,HH24)-------------------- -----------------------2003-10-13 19:35:21 1912.年月日的处理select older_date, newer_date, years, months, abs( trunc( newer_date - add_months( older_date,years*12 months )) ) days rom ( 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)rownum newer_date from emp ) )13.处理月份天数不定的办法select to_char(add_months(last_day(sysdate) 1, -2), yyyymmdd),last_day(sysdate) from dual14.找出今年的天数select add_months(trunc(sysdate,year), 12) - trunc(sysdate,year) from dual闰年的处理方法to_char( last_day( to_date(02 | | :year,mmyyyy) ), dd )如果是28就不是闰年15.yyyy与rrrr的区别YYYY99 TO_C------- ----yyyy 99 0099rrrr 99 1999yyyy 01 0001rrrr 01 200116.不同时区的处理select to_char( NEW_TIME( sysdate, GMT,EST), dd/mm/yyyy hh:mi:ss) ,sysdate from dual;17.5秒钟一个间隔Select TO_DATE(FLOOR(TO_CHAR(sysdate,SSSSS)/300) * 300,SSSSS) ,TO_CHAR(sysdate,SSSSS) from dual2002-11-1 9:55:00 35786SSSSS表示5位秒数18.一年的第几天select TO_CHAR(SYSDATE,DDD),sysdate from dual310 2002-11-6 10:03:5119.计算小时,分,秒,毫秒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)) mSecondsfrom ( select trunc(sysdate) Days, sysdate - trunc(sysdate) A from dual )select * from tabname 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.next_day函数 返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日next_day(sysdate,6)是从当前开始下一个星期五。后面的数字是从星期日开始算起。1 2 3 4 5 6 7日 一 二 三 四 五 六---------------------------------------------------------------select (sysdate-to_date(2003-12-03 12:55:45,yyyy-mm-dd hh24:mi:ss))*24*60*60 from ddual日期 返回的是天 然后 转换为ss21.round[舍入到最接近的日期](day:舍入到最接近的星期日)select sysdate S1,round(sysdate) S2 ,round(sysdate,year) YEAR,round(sysdate,month) MONTH ,round(sysdate,day) DAY from dual22.trunc[截断到最接近的日期,单位为天] ,返回的是日期类型select sysdate S1,trunc(sysdate) S2, //返回当前日期,无时分秒trunc(sysdate,year) YEAR, //返回当前年的1月1日,无时分秒trunc(sysdate,month) MONTH , //返回当前月的1日,无时分秒trunc(sysdate,day) DAY //返回当前星期的星期天,无时分秒from dual23.返回日期列表中最晚日期select greatest(01-1月-04,04-1月-04,10-2月-04) from dual24.计算时间差注:oracle时间差是以天数为单位,所以换算成年月,日//时间差-年select floor(to_number(sysdate-to_date(2007-11-02 15:55:03,yyyy-mm-dd hh24:mi:ss))/365) as spanYears from dual//时间差-月select ceil(moths_between(sysdate-to_date(2007-11-02 15:55:03,yyyy-mm-dd hh24:mi:ss))) as spanMonths from dual//时间差-天select floor(to_number(sysdate-to_date(2007-11-02 15:55:03,yyyy-mm-dd hh24:mi:ss))) as spanDays from dual//时间差-时select floor(to_number(sysdate-to_date(2007-11-02 15:55:03,yyyy-mm-dd hh24:mi:ss))*24) as spanHours from dual//时间差-分select floor(to_number(sysdate-to_date(2007-11-02 15:55:03,yyyy-mm-dd hh24:mi:ss))*24*60) as spanMinutes from dual//时间差-秒select floor(to_number(sysdate-to_date(2007-11-02 15:55:03,yyyy-mm-dd hh24:mi:ss))*24*60*60) as spanSeconds from dual25.更新时间注:oracle时间加减是以天数为单位,设改变量为n,所以换算成年月,日//改变时间-年select to_char(sysdate,yyyy-mm-dd hh24:mi:ss),to_char(sysdaten*365,yyyy-mm-dd hh24:mi:ss) as newTime from dual//改变时间-月select to_char(sysdate,yyyy-mm-dd hh24:mi:ss),add_months(sysdate,n) as newTime from dual//改变时间-日select to_char(sysdate,yyyy-mm-dd hh24:mi:ss),to_char(sysdaten,yyyy-mm-dd hh24:mi:ss) as newTime from dual//改变时间-时select to_char(sysdate,yyyy-mm-dd hh24:mi:ss),to_char(sysdaten/24,yyyy-mm-dd hh24:mi:ss) as newTime from dual//改变时间-分select to_char(sysdate,yyyy-mm-dd hh24:mi:ss),to_char(sysdaten/24/60,yyyy-mm-dd hh24:mi:ss) as newTime from dual//改变时间-秒select to_char(sysdate,yyyy-mm-dd hh24:mi:ss),to_char(sysdaten/24/60/60,yyyy-mm-dd hh24:mi:ss) as newTime from dual26.查找月的第一天,最后一天SELECT Trunc(Trunc(SYSDATE, MONTH) - 1, MONTH) First_Day_Last_Month,Trunc(SYSDATE, MONTH) - 1 / 86400 Last_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 dual2.查找子串位置select instr(abcfdgfdhd,fd) from dual3.字符串连接select HELLO||hello world from dual;4.去空格前导后缀1)去掉字符串中的空格select ltrim( abc) s1,rtrim(zhang ) s2, trim( zhang ) s3 from dual2)去掉前导和后缀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 dual6.返回ascii值对应的字母select chr(97) from dual7.计算字符串长度select length(abcdef) from dual8.initcap首字母变大写 ,lower(变小写),upper(变大写)select lower(ABC) s1, upper(def) s2, initcap(efg) s3 from dual;9.Replaceselect replace(abc,b,xy) from dual;10.translateselect 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;例://如果seed为111,则取1000;为200,取2000;其它取0select seed,account_name,decode(seed,111,1000,200,2000,0) from t_userInfo//如果seed111,则显示大;为200,则显示小;其它则显示相等select seed,account_name,decode(sign(seed-111),1,big seed,-1,little seed,equal seed) from t_userInfo13 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;转换函数1to_char()[将日期和数字类型转换成字符类型]1) select to_char(sysdate) s1,to_char(sysdate,yyyy-mm-dd) s2,to_char(sysdate,yyyy) s3,to_char(sysdate,yyyy-mm-dd hh12: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 emp2, 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 sum1.整个结果集是一个组求部门30 的最高工资最低工资,平均工资总人数有工作的人数工种数量及工资总和select max(ename),max(sal), min(ename),min(sal), avg(sal), count(*) ,count(job),count(distinct(job)) ,sum(sal) from emp where deptno30;2.带group by 和 having 的分组按部门分组求最高工资最低工资总人数有工作的人数工种数量及工资总和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;部门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 deptno30;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 Byrollup 按分组的第一个列进行统计和最后的小计cube 按分组的所有列的进行统计和最后的小计select deptno,job ,sum(sal) from emp group by deptno,job;select deptno,job ,sum(sal) from emp group by rollup(deptno,job);cube 产生组内所有列的统计和最后的小计select deptno,job ,sum(sal) from emp group by cube(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:事务结束清除数据在事务结束时自动删除表的数据

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价