在oracle中,我需要计算一个基于1的值,即从给定日期起经过的年数,即闰年。
最初的计算没有考虑闰年。是的
CEIL ((SYSDATE- prog_start_dt) / 365))
然后我决定用 MONTHS_BETWEEN
,但我的新计算中有一个错误:
CEIL(MONTHS_BETWEEN(SYSDATE, prog_start_dt) / 12)
问题是如果我在 prog_start_date
无论时间长短,该值都小于1。前任。:
sysdate = 2020-07-01 15:30:00
prog_start_dt = 2019-07-01 00:00:00
--> 1. CEIL ((SYSDATE- prog_start_dt) / 365)) --> Result: 2
--> 2. CEIL(MONTHS_BETWEEN(SYSDATE, prog_start_dt) / 12) --> Result 1
正确的结果是 2
. 所以我需要顶级公式的行为,但是考虑闰年,这显然是不可能的 365
. 有什么好办法吗?
2条答案
按热度按时间mxg2im7a1#
这是一种记录在案的行为:
如果
date1
以及date2
如果是一个月的同一天,或者是两个月的最后几天,则结果总是整数。如果您真的想解决这个问题,那么一个选项是添加一些逻辑来处理这个特定的情况:当比较的日期属于同一个月和同一天时,检查时间部分以查看年份是否已经过去:
db小提琴演示:
htzpubme2#
从上的文档
MONTHS_BETWEEN
:MONTHS_BETWEEN
返回日期之间的月数date1
以及date2
. 如果date1
晚于date2
,则结果为正。如果date1
早于date2
,则结果为负。如果date1
以及date2
如果是一个月的同一天,或者是两个月的最后几天,则结果总是整数。否则,oracle数据库将根据31天的月份计算结果的小数部分,并考虑时间组件的差异date1
以及date2
.你可以“修复”
MONTHS_BETWEEN
因此,当一个月的某一天相同(或者如果它们都是一个月的最后几天)时,它并不总是使用整数值,使用:所以,你的问题是:
对于一些测试数据:
这将输出:
db<>在这里摆弄