Select MOD (RUNC (MONTHS_BETWEEN (TO_DATE ('28-Mar-2017', 'DD-MON-YYYY'),
TO_DATE ('28-Feb-2017', 'DD-MON-YYYY'))), 12) Months from dual
为什么这个功能即使月份没有完成也会返回1个月?它应该是0
答案 0 :(得分:5)
你错了。 MONTHS_BETWEEN
将时间跨度从date '2017-02-28'
视为date '2017-03-28'
仅为一个月(相邻两个月的同一天)。这可以在文档中阅读:https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions089.htm
MONTHS_BETWEEN返回date1和date2之间的月份数。如果date1晚于date2,则结果为正。如果date1早于date2,则结果为负数。如果date1和date2是该月的同一天或两个月的最后几天,则结果始终为整数。否则,Oracle数据库会根据31天的月份计算结果的小数部分,并考虑时间组件date1和date2的差异。
一个日期比另一个日期大,所以你得到一个正数或负数(即不是零)取决于哪个是第一个参数,哪个是第二个参数,并且当天数相等时,结果将是一个整数。相邻月份为1或-1。
无论如何,月份计算是一件奇怪的事情,因为一个月不是定义的时间跨度。您似乎有一个特定的定义,这与MONTHS_BETWEEN
定义它的方式有所不同。这没什么不对的。在这种情况下,我同意MONTHS_BETWEEN
;从2月28日到3月28日是“完全”一个月。如果你想要不同的规则,那么应用你自己的数学: - )
答案 1 :(得分:1)
因为它适用于documented specification:
MONTHS_BETWEEN
返回日期date1
和date2
之间的月份数。 月份的月份和最后一天由参数定义NLS_CALENDAR
。如果date1
晚于date2
,则结果为。{1}} 正。如果date1
早于date2
,则结果为否定。 如果date1
和date2
是该月的同一天或最后一天 几个月的几天,那么结果总是一个整数。否则Oracle 数据库根据a计算结果的小数部分 31个月的月份并考虑时间组成部分date1
和。{date2
。
如果您的要求与此不同,那么您需要编写自己的函数。