Oracle兼容-函数-MONTHS_BETWEEN()函数


1. 语法

1. MONTHS_BETWEEN(date1, date2)

2. 定义和用法

函数 MONTHS_BETWEEN() 的作用是计算日期 date1 和date2 之间相差的月份数,返回值类型要看具体情况,详见下方说明。

1. 关于返回值是正数还是负数

  • 若 date1 晚于 date2,则返回正数;
  • 若 date1 早于 date2,则返回负数;
  • 若 date1 与 date2 相同,则返回0。

2. 关于返回值是正数还是小数

  • 若 date1 和 date2 中的日期数值相同(如:'2021-04-13'和'2021-03-13')或均为各自月份的最后一天(如:'2021-02-28'和'2021-03-31'),则返回结果为整数;
  • 其余情况数据库会以31天为分母,并根据date1和date2里的天数差(小于31天)计算结果中的小数部分。

3. Oracle兼容说明

  • 函数 MONTHS_BETWEEN() 的输入参数支持字符串格式,GreatSQL会将其自动转换为 DATE/DATETIME 类型后再进行日期计算,但需保证输入的字串能被转成正确的日期类型,否则会因日期转换错误返回NULL,并提示warning,因输入不合法信息导致与Oracle结果显示不一致的问题时,目前暂不做处理。

注:合法的日期字串应至少包含完整的日期部分(年、月、日),时间部分(时、分、秒)为可选项;当指定的时间部分时,也应包含完整的时分秒的值。合法的格式如下面几种:

  • YYMMDD,’230518’
  • YYYYMMDD,’20230518’
  • YYMMDDHHmmss,’230518095050’
  • YYYYMMDDHHmmss,’20230518095050’
  • YY-MM-DD,’23-05-18’
  • YYYY-MM-DD,’2023-05-18’
  • YYYY-MM-DD HH,’2023-05-18 09’
  • YYYY-MM-DD HH:mm,’2023-05-18 09:50’
  • YY-MM-DD HH:mm:ss,’23-05-18 09:50:50’

而类似下面这几种则是非法格式,无法被解析:

  • YYYYMMDDHH,’2022020203’
  • YYYYMM,’202102’
1. -- 参数日期格式不合法,不能解析,返回NULL
2. greatsql> SELECT MONTHS_BETWEEN('2022022823', '20220224') FROM DUAL;
3. +-----------------------------------------+
4. | MONTHS_BETWEEN('2022022823','20220224') |
5. +-----------------------------------------+
6. |                                    NULL |
7. +-----------------------------------------+
8. 1 row in set, 1 warning (0.00 sec)

10. greatsql> SHOW WARNINGS;
11. +---------+------+----------------------------------------+
12. | Level   | Code | Message                                |
13. +---------+------+----------------------------------------+
14. | Warning | 1292 | Incorrect datetime value: '2022022823' |
15. +---------+------+----------------------------------------+

4. 示例

1. greatsql> SELECT MONTHS_BETWEEN(TO_DATE('2021-3-21', 'yyyy-mm-dd'), TO_DATE('2021-1-10', 'yyyy-mm-dd')) AS MT1 FROM DUAL
2. UNION ALL
3. SELECT MONTHS_BETWEEN('2021-3-21', '2021-1-10') FROM DUAL;
4. +--------------------+
5. | MT1                |
6. +--------------------+
7. | 2.3548387096774195 |
8. | 2.3548387096774195 |
9. +--------------------+

11. greatsql> SELECT MONTHS_BETWEEN(TO_DATE('2021-1-10', 'yyyy-mm-dd'), TO_DATE('2021-3-21', 'yyyy-mm-dd')) AS MT2 FROM DUAL
12. UNION ALL
13. SELECT MONTHS_BETWEEN( '2021-1-10', '2021-3-21' );
14. +---------------------+
15. | MT2                 |
16. +---------------------+
17. | -2.3548387096774195 |
18. | -2.3548387096774195 |
19. +---------------------+

注意:函数 MONTHS_BETWEEN() 使用相关注意事项可参考函数 TO_DATE() 中的规则。

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx