【问题标题】:Months between not returning correct value未返回正确值之间的几个月
【发布时间】:2017-09-06 17:18:57
【问题描述】:
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

【问题讨论】:

  • "ORACLE MOTHSBETWEEN" 讨厌这种情况。无尽的错误来源。 ;-)
  • 你认为他们之间为什么没有一个月? 2 月 1 日到 3 月 1 日会有一个月的差异,那么为什么 2 月 28 日到 3 月 28 日不是一个月的差异呢?

标签: sql oracle


【解决方案1】:

你错了。 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 日“正好”是一个月。如果您想要不同的规则,请应用您自己的数学:-)

【讨论】:

    【解决方案2】:

    因为它正在使用它的documented specification

    MONTHS_BETWEEN 返回日期 date1date2 之间的月数。 月份和月份的最后一天由参数定义 NLS_CALENDAR。如果date1 晚于date2,则结果为 积极的。如果date1 早于date2,则结果是否定的。 如果 date1date2 是一个月中的同一天或两者都是最后一天 月的天数,则结果始终为整数。否则甲骨文 数据库根据计算结果的小数部分 每月 31 天,并考虑时间分量的差异date1date2.

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2017-04-09
      • 2019-10-07
      • 1970-01-01
      • 2017-09-13
      • 2018-05-19
      相关资源
      最近更新 更多