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函数,它将输入的字符串序列,转换为指定格式的日期函数,由此可得其它更为全面的实例为:
- 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学习笔记之表空间等概念及用户权限关于Oracle的commit相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)