早上好,我编写了以下查询,以获取存储在两个不同表中的日期列(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个月…
有人能帮我找出问题吗?提前感谢
这正是文档中描述的行为:
如果date1和date2是一个月的同一天,或者都是几个月的最后一天,则结果始终是一个整数。否则,Oracle数据库将根据31天的月份计算结果的小数部分,并考虑时间分量date1和date2的差异。
(注意:突出显示是我的。(
如果你运行这个代码:
select months_between(date '2021-02-28', date '2020-10-29') as delta
from dual
结果是3.9677。
我怀疑你想要一些其他的逻辑。然而,这个问题并没有具体说明您实际想要什么逻辑。
我实际上想要月份的差异,而不考虑一个月的具体日期。
您可以使用'MM'
格式元素将这两个值截断到每月的第一个,然后获得它们之间的差异:
months_between (trunc(a.VLD_FRM_TMS, 'MM'), trunc(STRT_DT, 'MM')) as delta
现在,它将始终是一个整数,即月的整数,因此您不需要截断/取整结果。
db<gt;摆弄旧的计算和这个版本的问题。