当前位置:首页 > 问答 > 正文

树叶云里讲OceanBase那个ADD_MONTHS函数咋用,简单又实操的教程分享

树叶云里讲OceanBase那个ADD_MONTHS函数咋用,简单又实操的教程分享 直接整合自树叶云的分享,并参考了其他技术社区如CSDN、博客园的相关讨论)

直接开讲,这个ADD_MONTHS函数,说白了就是个“日期计算器”,专门帮你算几个月之前或几个月之后是哪一天,你比如说,今天是你入职的日子,你想知道三个月后转正是哪一天,或者某个账单日是每个月的25号,你想提前算出下个月25号是星期几,这个函数就派上用场了。

函数长啥样?基本语法是啥?

根据树叶云的讲解,这个函数用起来超级简单,就两个部分:

ADD_MONTHS(日期, 月数)

  • 日期:就是你输入的那个起始日子,它可以是一个具体的日期值(DATE '2023-10-27'),也可以是一个包含日期的字段名。
  • 月数:就是你想要加上的月份数量,这个数可以是正数,也可以是负数。
    • 正数:表示计算这个日期 之后 的几个月。
    • 负数:表示计算这个日期 之前 的几个月。
    • 小数:这个有点特别,树叶云里也提到了,OceanBase会先把小数部分截掉,只保留整数部分进行计算。ADD_MONTHS(某个日期, 2.9)ADD_MONTHS(某个日期, 2) 效果是一样的。

上手实操,看看它怎么干活

光说不练假把式,我们直接写几条SQL看看效果,假设我们现在有个简单的测试表,就叫 test_dates,里面有个日期字段叫 my_date

场景1:基本操作——加几个月、减几个月

我们先插入一个固定的日期,比如2023年10月27日。

INSERT INTO test_dates (my_date) VALUES (DATE '2023-10-27');

然后我们来查询:

SELECT my_date AS 原始日期, ADD_MONTHS(my_date, 1) AS 一个月后, ADD_MONTHS(my_date, 3) AS 三个月后, ADD_MONTHS(my_date, -2) AS 两个月前 FROM test_dates;

查出来的结果大概是这样的:

原始日期 一个月后 三个月后 两个月前
2023-10-27 2023-11-27 2024-01-27 2023-08-27

看,是不是很直观?加1个月就是11月27,加3个月因为跨年了,就变成了2024年1月27,减2个月就是8月27。

场景2:处理月底日期——这个最容易被问到

这是ADD_MONTHS函数一个非常贴心的地方,树叶云里特别强调了这一点,如果起始日期是某个月的最后一天,那么计算后的结果也会是那个月的最后一天。

我们再来个例子,假设起始日期是2023年1月31日,这个月最后一天。

SELECT DATE '2023-01-31' AS 原始日期, ADD_MONTHS(DATE '2023-01-31', 1) AS 一个月后, ADD_MONTHS(DATE '2023-01-31', 2) AS 两个月后;

你猜结果是什么?

原始日期 一个月后 两个月后
2023-01-31 2023-02-28 2023-03-31
  • 一个月后:1月31日加1个月,按常理应该是2月31日,但2月没有31号啊!这时候函数很聪明,它不会给你报错,而是直接返回2月的最后一天,也就是28日。
  • 两个月后:从1月31日开始算,两个月后是3月,3月有31天,所以结果就是3月31日。

这个特性在计算账单日、合同到期日时特别有用,能避免出现无效的日期。

场景3:月份数字是小数或零

就像前面说的,小数会被“砍掉”小数部分。

SELECT DATE '2023-10-27' AS 原始日期, ADD_MONTHS(DATE '2023-10-27', 0) AS 加零个月, ADD_MONTHS(DATE '2023-10-27', 1.5) AS 加1点5个月, ADD_MONTHS(DATE '2023-10-27', -1.9) AS 减1点9个月;

结果:

原始日期 加零个月 加1点5个月 减1点9个月
2023-10-27 2023-10-27 2023-11-27 2023-09-27
  • 加零个月:还是自己。
  • 加1.5个月:0.5被忽略,相当于加1个月。
  • 减1.9个月:0.9被忽略,相当于减1个月。

实际工作里你可能用到的例子

  1. 计算会员到期日:用户今天(2023-10-27)开通了为期6个月的会员。 SELECT ADD_MONTHS(DATE '2023-10-27', 6) AS 会员到期日; -- 结果是 2024-04-27

  2. 查找上个月的所有订单:假设你的订单表叫 orders,里面有下单时间 order_timeSELECT * FROM orders WHERE order_time >= ADD_MONTHS(TRUNC(SYSDATE), -1) AND order_time < TRUNC(SYSDATE); (这里用了 TRUNC(SYSDATE) 得到今天凌晨的日期,减一个月就是上个月今天的凌晨,用来框定上个月的范围。)

  3. 项目计划:一个项目从2023-11-15开始,第一阶段需要2个月,第二阶段在第一阶段结束后再过1个月开始。 SELECT DATE '2023-11-15' AS 项目开始, ADD_MONTHS(DATE '2023-11-15', 2) AS 第一阶段结束, ADD_MONTHS(DATE '2023-11-15', 3) AS 第二阶段开始;

最后总结一下(树叶云风格):

ADD_MONTHS这个函数,在OceanBase里就是个省心小工具,你只要记住 ADD_MONTHS(日子, 月数) 这个格式就行,正数往后推,负数往前推,最关键的是它自动处理月底问题,不会让你算出2月30号这种不存在的日子,非常智能,下次遇到要算几个月前或几个月后的日子,别掰手指头了,直接用这个函数,准没错!

希望这个简单又实操的分享对你有帮助!

树叶云里讲OceanBase那个ADD_MONTHS函数咋用,简单又实操的教程分享