Oracle学习笔记之日期函数

Oracle日期函数学习时,在教程有几个实例如下:

Months_between(’01-sep-95’, ’11-jan-94’) 结果是:19.6774194 Add_months 在指定的月份上面增加相应得月份 例如: Add_months(’11-jan-94’, 6) 结果是:11-jul-94 Next_day 计算规定日期的后一个特定日期 例如: Next_day(’01-sep-95’, ‘Friday’ ) 结果是: 08-sep-95 Last_day 指这个月最后一天 例如: Last_day(’01-feb-95’) 

然而在SQL*plus输入这些函数执行时,却总得不到正确的结果,因为日期的格式无法识别。正确的用法应该如下:

select MONTHS_BETWEEN('24-2月-2010','24-2月-2010') from dual。这样写很不方便,为了避免出现这样的问题,在自己书写日期时,最好用自己喜欢的方式书写,并用to_date函数指定格式如:

select MONTHS_BETWEEN(to_date('20100224','yyyymmdd'),to_date('20100524','yyyymmdd')) from dual 

这里涉及到一个to_date函数,它将输入的字符串序列,转换为指定格式的日期函数,由此可得其它更为全面的实例为(以下部分摘自http://blog.csdn.net/sxpyrgz):

1.ADD_MONTHS 增加或减去月份 SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual; TO_CHA ------ 200002 SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual; TO_CHA ------ 199910 2.LAST_DAY 返回日期的最后一天 SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual; TO_CHAR(SY TO_CHAR((S ---------- ---------- 2004.05.09 2004.05.10 SQL> select last_day(sysdate) from dual; LAST_DAY(S ---------- 31-5月 -04 3.MONTHS_BETWEEN(date2,date1) 给出date2-date1的月份 SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual; MON_BETWEEN ----------- 9 SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual; MON_BETW --------- -60 注:SELECT months_between(SYSDATE, sysdate) same, months_between(SYSDATE, add_months(sysdate, -1)) big, months_between(SYSDATE, add_months(sysdate, 1))small FROM DUAL; SAME BIG SMALL 0 1 -1 4.NEW_TIME(date,'this','that') 给出在this时区=other时区的日期和时间 SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time 2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual; BJ_TIME LOS_ANGLES ------------------- ------------------- 2004.05.09 11:05:32 2004.05.09 18:05:32 5.NEXT_DAY(date,'day') 给出日期date和星期x之后计算下一个星期的日期 SQL> select next_day('18-5月-2001','星期五') next_day from dual; NEXT_DAY ---------- 25-5月 -01 注:返回指定日期后第一个n的日期,n为一周中的某一天。但是,需要注意的是n如果为字符的话,它的星期形式需要与当前session默认时区中的星期形式相同。 例如:三思用的中文nt,nls_language值为SIMPLIFIED CHINESE SELECT NEXT_DAY(SYSDATE,5) FROM DUAL; SELECT NEXT_DAY(SYSDATE,'星期四') FROM DUAL; 两种方式都可以取到正确的返回,但是: SELECT NEXT_DAY(SYSDATE,'Thursday') FROM DUAL; 则会执行出错,提供你说周中的日无效,就是这个原因了。 6.SYSDATE 用来得到系统的当前日期 CURRENT_DATE 返回当前session所在时区的默认时间 sysdate与current_date获得的时间不一定相同,某些情况下current_date会比sysdate快一秒。经过与xyf_tck(兄台的大作ORACLE的工作机制写的很好,深入浅出)的短暂交流,我们认为current_date是将current_timestamp中毫秒四舍五入后的返回,虽然没有找到文档支持,但是想来应该八九不离十。同时,仅是某些情况下会有一秒的误差,一般情况下并不会对你的操作造成影响,所以了解即可。 SELECT SYSDATE,CURRENT_DATE FROM DUAL; SYSDATE CURRENT_DATE 2008-12-23 PM 05:05:59 2008-12-23 PM 05:06:00 SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual; TO_CHAR(SYSDATE,' ----------------- 09-05-2004 星期日 trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒 SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh, 2 to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual; HH HHMM ------------------- ------------------- 2004.05.09 11:00:00 2004.05.09 11:17:00 7.TO_CHAR(date,'format') SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YY ------------------- 2004/05/09 21:14:41 8.TO_DATE(string,'format') 将字符串转化为ORACLE中的一个日期 日期函数: greatest(d1,d2,...dn) 给出的日期列表中最后的日期 least(d1,k2,...dn) 给出的日期列表中最早的日期 to_char(d [,fmt]) 日期d按fmt指定的格式转变成字符串 to_date(st [,fmt]) 字符串st按fmt指定的格式转成日期值,若fmt忽略,st要用缺省格式 round(d [,fmt]) 日期d按fmt指定格式舍入到最近的日期 trunc(d [,fmt]) 日期d按fmt指定格式截断到最近的日期 附: 日期格式: -------------------------------- 格式代码  说明 举例或可取值的范围 -------------------------------- DD 该月某一天 1-3 DY     三个大写字母表示的周几 SUN,...SAT DAY     完整的周几,大写英文 SUNDAY,...SATURDAY MM 月份 1-12 MON     三个大写字母表示的月份 JAN,...DEC MONTH 完整 JANUARY,...DECEMBER RM 月份的罗马数字 I,...XII YY或YYYY 两位,四位数字年 HH:MI:SS    时:分:秒 HH12或HH24   以12小时或24小时显示 MI       分 SS       秒 AM或PM    上下午指示符 SP      后缀SP要求拼写出任何数值字段 TH      后缀TH表示添加的数字是序数 4th,1st FM 前缀对月或日或年值,禁止填充 --------------------------------- 9.求两日期某一部分的差(比如秒)    直接用两个日期相减(比如d1-d2=12.3)    SELECT (d1-d2)*24*60*60 vaule FROM DUAL; 10.根据差值求新的日期(比如分钟)    SELECT sysdate+8/60/24 vaule FROM DUAL; 11.求不同时区时间   SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;  -----时区参数,北京在东8区应该是Ydt-------   AST ADT 大西洋标准时间   BST BDT 白令海标准时间   CST CDT 中部标准时间   EST EDT 东部标准时间   GMT 格林尼治标准时间   HST HDT 阿拉斯加—夏威夷标准时间   MST MDT 山区标准时间   NST 纽芬兰标准时间   PST PDT 太平洋标准时间   YST YDT YUKON标准时间 12 求某一时间之前之后的时间 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual 前时间减去7小时的时间 select sysdate - interval '7' hour from dual 当前时间减去7天的时间 select sysdate - interval '7' day from dual 当前时间减去7月的时间 select sysdate,sysdate - interval '7' month from dual 当前时间减去7年的时间 select sysdate,sysdate - interval '7' year from dual 时间间隔乘以一个数字 select sysdate,sysdate - 8 *interval '2' hour from dual 别的时间也可以做些类似的处理 select to_date('2007-12-12','yyyy-mm-dd'),to_date('2007-12-12','yyyy-mm-dd') - interval '7' day from dual 

to_date函数对应的另两个函数是:

to_char用于将日期和数值转换为字符,也可包含格式字符串

to_number用于将字符串转换为数值,包含格式字符串

你可能感兴趣的:(oracle,sql,Date,session,String,2010)