【问题标题】:Oracle Months Between does not work properlyOracle Months Between 无法正常工作
【发布时间】:2023-04-10 15:51:02
【问题描述】:

早上好, 我编写了以下查询来获取存储在两个不同表中的日期列 (STRT_DT) 和时间戳列 (VLD_FRM_TMS) 之间的月份差异。 我不知道为什么它适用于某些记录但不适用于其他记录(它计算的时间少了一个月)

select ID, floor (months_between (cast(a.VLD_FRM_TMS as date), STRT_DT)) as delta
from TABLE_A a
inner join TABLE_B b
on a.ID = b.ID 

这是一个无法计算的记录示例:

VLD_FRM_TMS
-----------
28-FEB-21 12.00.00.000000000 AM

STRT_DT
--------
29-OCT-20

公式计算的是 3 个月而不是 4 个月...

谁能帮我找出问题所在? 提前谢谢你

【问题讨论】:

  • 因为结果是3.xxx 月,而您使用的是floor。尝试使用round 而不是floor。
  • 或者在计算差异之前可能会截断这两个值,因此您正在比较每个月的第一天;但这取决于您应该应用什么逻辑。
  • 感谢您的解释。是的,我实际上想要月差,而不管一个月中的具体哪一天。因此,在比较之前截断两个日期应该可行。我正在尝试写它

标签: sql oracle date timestamp


【解决方案1】:

这正是documentation 中描述的行为:

如果 date1 和 date2 是一个月中的同一天或两个月的最后一天,则结果始终为整数。否则,Oracle 数据库会根据 31 天的月份计算结果的小数部分,并考虑时间组件 date1 和 date2 的差异。

(注意:突出显示是我的。)

如果你运行这段代码:

select months_between(date '2021-02-28', date '2020-10-29') as delta
from dual

结果是 3.9677。

我怀疑你想要一些其他的逻辑。然而,这个问题并没有具体说明你真正想要什么逻辑。

【讨论】:

    【解决方案2】:

    我实际上想要月差,而不管一个月中的具体哪一天。

    你可以truncate这两个值到每月的第一天using the 'MM' format element,然后得到它们之间的差:

    months_between (trunc(a.VLD_FRM_TMS, 'MM'), trunc(STRT_DT, 'MM')) as delta
    

    现在这将始终是一个整数 - 即整数个月 - 所以您不需要截断/取整/舍入结果。

    db<>fiddle 显示旧计算和此版本的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2017-08-03
      • 2018-03-25
      • 2021-12-25
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多