视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle:时间运算
2020-11-09 08:28:15 责编:小采
文档


欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 【3】求两个日期相差的月数: 通常情况下两个时间相减将得到以天数为单位的结果,可是有时我们更希望得到以月为单位的结果,如果手动转换这太麻烦了,所以Oracle又提供了一个函数,这个函数就是mont

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入

  【3】求两个日期相差的月数:

  通常情况下两个时间相减将得到以天数为单位的结果,可是有时我们更希望得到以月为单位的结果,如果手动转换这太麻烦了,所以Oracle又提供了一个函数,这个函数就是months_between.

  SQL> select months_between(sysdate,

  2 to_date('2008-01-01 01:00:00', 'yyyy-mm-dd hh:mi:ss')) result

  3 from dual;

  RESULT

  5.94928203

  months_between函数有2个参数,第一个参数是结束日期,第二个参数是开始日期,Oracle用第一个参数减去第二个参数得到月份数。所以结果有可能会是负数的。

  四、年份加减:

  Oracle并不直接提供对年份进行加减的函数,不过有了add_months和months_between函数,我们照样可以做到。

  【1】为当前日期加上2年:

  SQL> select add_months(sysdate, 2*12) two_years_later

  2 from dual;

  TWO_YEARS_

  30-6月 -10

  【2】求两个日期相差几年:

  SQL> select months_between(sysdate,

  2 to_date('2006-06-30', 'yyyy-mm-dd')) / 12 years_between

  3 from dual;

  YEARS_BETWEEN

  2

  直接将两个日期相减,然后除以365天并不准确,但是不管一年有多少天它总是只有12个月,所以利用这一点我们可以先求出两个日期相差的月数,再除以12就得出相差的年数了

  五、求每月的最后一天:

  SQL> select last_day(add_months(sysdate,2)) last_day

  2 from dual;

  LAST_DAY

  31-8月 -08

  六、求每月的第一天:

  Oracle提供了last_day让我们能够求出所在月份的最后一天,但没有对应的first_day函数,如果有这方面的需求,只需要稍微动一下脑筋,利用last_day函数即可。例如下面的SQL语句就是求出下个月的第一天:

  SQL> select last_day(sysdate)+1 fisrt_day

  2 from dual;

  FISRT_DAY

  01-7月 -08

  在这里我们将"每月的第一天"转换成"上个月最后一天的下一天",问题就解决了!

  七、求下一个星期几:

  有时候我们会碰上"下个星期五是几号啊?"这样常见的问题。Oracle为此提供了一个函数:next_day,它的语法是这样的:next_day(date, string)。其中第一个参数date告诉Oracle从什么时候开始算起,第二个参数string则告诉Oracle要取的工作日。

  下面我们看看如何得到下个星期五的日期:

  SQL> select next_day(sysdate, 'Friday') "Next Friday" from dual;

  select next_day(sysdate, 'Friday') "Next Friday" from dual

  *

  ERROR at line 1:

  ORA-01846: 周中的日无效

  很奇怪!是不?明明语法没有问题,但为什么会说"周中的日无效"呢?这里就不得不说到Oracle中的语言和时区的问题了。下面这张图是使用TOAD截取出来的客户端session的语言和时区信息:

  图一

  从图中我们知道了客户端的语言是简体中文,日期使用的语言也是简体中文,这就是为什么上面的SQL语句出错的原因了,因为在中文中只有"星期一,星期二"这样的工作日表示,而没有"Monday,Firday"这样的写法!

  SQL> select next_day(sysdate,'星期五') "下周五" from dual;

  下周五

  04-7月 -08

  如果你不确定自己的时区或者你担心从一个时区移植到另一个时区时,SQL语句会出错,Oracle还允许你用数字的形式来表示工作日。但是要记得一点:1表示的是周日,2表示的是周一,3表示的是周二,依此类推。

  例如我要查下个周三是什么时候,则函数是这样写的:next_day(sysdate, 4)。

  SQL> select next_day(sysdate,4) from dual;

  NEXT_DAY(S

  02-7月 -08

[1] [2]

下载本文
显示全文
专题