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() 中的规则。
问题反馈
联系我们
扫码关注微信公众号

