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用于将字符串转换为数值,包含格式字符串