Oracle学习笔记之日期函数


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

  1. Months_between(’01-sep-95’, ’11-jan-94’)   
  2. 结果是:19.6774194   
  3.     
  4. Add_months 在指定的月份上面增加相应得月份   
  5. 例如:   
  6. Add_months(’11-jan-94’, 6)   
  7. 结果是:11-jul-94   
  8.     
  9. Next_day 计算规定日期的后一个特定日期   
  10. 例如:   
  11. Next_day(’01-sep-95’, ‘Friday’ )   
  12. 结果是:   
  13. 08-sep-95   
  14.     
  15. Last_day 指这个月最后一天   
  16. 例如:   
  17. Last_day(’01-feb-95’)  

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

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

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

这里涉及到一个to_date函数,它将输入的字符串序列,转换为指定格式的日期函数,由此可得其它更为全面的实例为:

  1. 1.ADD_MONTHS    
  2. 增加或减去月份    
  3. SQL> select to_char(add_months(to_date('199912','yyyymm'),2),'yyyymm') from dual;    
  4. TO_CHA    
  5. ------    
  6. 200002    
  7. SQL> select to_char(add_months(to_date('199912','yyyymm'),-2),'yyyymm') from dual;    
  8. TO_CHA    
  9. ------    
  10. 199910    
  11. 2.LAST_DAY    
  12. 返回日期的最后一天    
  13. SQL> select to_char(sysdate,'yyyy.mm.dd'),to_char((sysdate)+1,'yyyy.mm.dd') from dual;    
  14. TO_CHAR(SY TO_CHAR((S    
  15. ---------- ----------    
  16. 2004.05.09 2004.05.10    
  17. SQL> select last_day(sysdate) from dual;    
  18. LAST_DAY(S    
  19. ----------    
  20. 31-5月 -04    
  21. 3.MONTHS_BETWEEN(date2,date1)    
  22. 给出date2-date1的月份    
  23. SQL> select months_between('19-12月-1999','19-3月-1999') mon_between from dual;    
  24. MON_BETWEEN    
  25. -----------    
  26. 9    
  27. SQL>selectmonths_between(to_date('2000.05.20','yyyy.mm.dd'),to_date('2005.05.20','yyyy.mm.dd')) mon_betw from dual;    
  28. MON_BETW    
  29. ---------    
  30. -60    
  31. 注:SELECT months_between(SYSDATE, sysdate) same,    
  32. months_between(SYSDATE, add_months(sysdate, -1)) big,    
  33. months_between(SYSDATE, add_months(sysdate, 1))small    
  34. FROM DUAL;    
  35. SAME BIG SMALL    
  36. 0 1 -1    
  37. 4.NEW_TIME(date,'this','that')    
  38. 给出在this时区=other时区的日期和时间    
  39. SQL> select to_char(sysdate,'yyyy.mm.dd hh24:mi:ss') bj_time,to_char(new_time    
  40. 2 (sysdate,'PDT','GMT'),'yyyy.mm.dd hh24:mi:ss') los_angles from dual;    
  41. BJ_TIME LOS_ANGLES    
  42. ------------------- -------------------    
  43. 2004.05.09 11:05:32 2004.05.09 18:05:32    
  44. 5.NEXT_DAY(date,'day')    
  45. 给出日期date和星期x之后计算下一个星期的日期    
  46. SQL> select next_day('18-5月-2001','星期五') next_day from dual;    
  47. NEXT_DAY    
  48. ----------    
  49. 25-5月 -01    
  50. 注:返回指定日期后第一个n的日期,n为一周中的某一天。但是,需要注意的是n如果为字符的话,它的星期形式需要与当前session默认时区中的星期形式相同。    
  51. 例如:三思用的中文nt,nls_language值为SIMPLIFIED CHINESE    
  52. SELECT NEXT_DAY(SYSDATE,5) FROM DUAL;    
  53. SELECT NEXT_DAY(SYSDATE,'星期四') FROM DUAL;    
  54. 两种方式都可以取到正确的返回,但是:    
  55. SELECT NEXT_DAY(SYSDATE,'Thursday') FROM DUAL;    
  56. 则会执行出错,提供你说周中的日无效,就是这个原因了。    
  57. 6.SYSDATE    
  58. 用来得到系统的当前日期    
  59. CURRENT_DATE 返回当前session所在时区的默认时间    
  60. sysdate与current_date获得的时间不一定相同,某些情况下current_date会比sysdate快一秒。经过与xyf_tck(兄台的大作ORACLE的工作机制写的很好,深入浅出)的短暂交流,我们认为current_date是将current_timestamp中毫秒四舍五入后的返回,虽然没有找到文档支持,但是想来应该八九不离十。同时,仅是某些情况下会有一秒的误差,一般情况下并不会对你的操作造成影响,所以了解即可。    
  61. SELECT SYSDATE,CURRENT_DATE FROM DUAL;    
  62. SYSDATE CURRENT_DATE    
  63. 2008-12-23 PM 05:05:59 2008-12-23 PM 05:06:00    
  64. SQL> select to_char(sysdate,'dd-mm-yyyy day') from dual;    
  65. TO_CHAR(SYSDATE,'    
  66. -----------------    
  67. 09-05-2004 星期日    
  68. trunc(date,fmt)按照给出的要求将日期截断,如果fmt='mi'表示保留分,截断秒    
  69. SQL> select to_char(trunc(sysdate,'hh'),'yyyy.mm.dd hh24:mi:ss') hh,    
  70. 2 to_char(trunc(sysdate,'mi'),'yyyy.mm.dd hh24:mi:ss') hhmm from dual;    
  71. HH HHMM    
  72. ------------------- -------------------    
  73. 2004.05.09 11:00:00 2004.05.09 11:17:00    
  74. 7.TO_CHAR(date,'format')    
  75. SQL> select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;    
  76. TO_CHAR(SYSDATE,'YY    
  77. -------------------    
  78. 2004/05/09 21:14:41    
  79. 8.TO_DATE(string,'format')    
  80. 将字符串转化为ORACLE中的一个日期    
  81. 日期函数:    
  82. greatest(d1,d2,...dn) 给出的日期列表中最后的日期    
  83. least(d1,k2,...dn) 给出的日期列表中最早的日期    
  84. to_char(d [,fmt]) 日期d按fmt指定的格式转变成字符串    
  85. to_date(st [,fmt]) 字符串st按fmt指定的格式转成日期值,若fmt忽略,st要用缺省格式    
  86. round(d [,fmt]) 日期d按fmt指定格式舍入到最近的日期    
  87. trunc(d [,fmt]) 日期d按fmt指定格式截断到最近的日期    
  88. 附:    
  89. 日期格式:    
  90. --------------------------------    
  91. 格式代码  说明 举例或可取值的范围    
  92. --------------------------------    
  93. DD 该月某一天 1-3    
  94. DY     三个大写字母表示的周几 SUN,...SAT    
  95. DAY     完整的周几,大写英文 SUNDAY,...SATURDAY    
  96. MM 月份 1-12    
  97. MON     三个大写字母表示的月份 JAN,...DEC    
  98. MONTH 完整 JANUARY,...DECEMBER    
  99. RM 月份的罗马数字 I,...XII    
  100. YY或YYYY 两位,四位数字年    
  101. HH:MI:SS    时:分:秒    
  102. HH12或HH24   以12小时或24小时显示    
  103. MI       分    
  104. SS       秒    
  105. AM或PM    上下午指示符    
  106. SP      后缀SP要求拼写出任何数值字段    
  107. TH      后缀TH表示添加的数字是序数 4th,1st    
  108. FM 前缀对月或日或年值,禁止填充    
  109. ---------------------------------    
  110. 9.求两日期某一部分的差(比如秒)    
  111.    直接用两个日期相减(比如d1-d2=12.3)    
  112.    SELECT (d1-d2)*24*60*60 vaule FROM DUAL;    
  113. 10.根据差值求新的日期(比如分钟)    
  114.    SELECT sysdate+8/60/24 vaule FROM DUAL;    
  115. 11.求不同时区时间    
  116.   SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;    
  117.  -----时区参数,北京在东8区应该是Ydt-------    
  118.   AST ADT 大西洋标准时间    
  119.   BST BDT 白令海标准时间    
  120.   CST CDT 中部标准时间    
  121.   EST EDT 东部标准时间    
  122.   GMT 格林尼治标准时间    
  123.   HST HDT 阿拉斯加—夏威夷标准时间    
  124.   MST MDT 山区标准时间    
  125.   NST 纽芬兰标准时间    
  126.   PST PDT 太平洋标准时间    
  127.   YST YDT YUKON标准时间    
  128. 12 求某一时间之前之后的时间    
  129. 当前时间减去7分钟的时间    
  130. select sysdate,sysdate - interval '7' MINUTE from dual    
  131. 前时间减去7小时的时间    
  132. select sysdate - interval '7' hour from dual    
  133. 当前时间减去7天的时间    
  134. select sysdate - interval '7' day from dual    
  135. 当前时间减去7月的时间    
  136. select sysdate,sysdate - interval '7' month from dual    
  137. 当前时间减去7年的时间    
  138. select sysdate,sysdate - interval '7' year from dual    
  139. 时间间隔乘以一个数字    
  140. select sysdate,sysdate - 8 *interval '2' hour from dual    
  141. 别的时间也可以做些类似的处理    
  142. 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用于将字符串转换为数值,包含格式字符串

相关内容