几个月之间没有返回正确的值

时间:2017-09-06 08:43:29

标签: sql oracle

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

2 个答案:

答案 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返回日期date1date2之间的月份数。   月份的月份和最后一天由参数定义   NLS_CALENDAR。如果date1晚于date2,则结果为。{1}}   正。如果date1早于date2,则结果为否定。   如果date1date2是该月的同一天或最后一天   几个月的几天,那么结果总是一个整数。否则Oracle   数据库根据a计算结果的小数部分   31个月的月份并考虑时间组成部分date1和。{   date2

如果您的要求与此不同,那么您需要编写自己的函数。