Can you try using the below scalar UDF..
CREATE FUNCTION NIT_SCN.MONTHS_BETWEEN(FDATE DATE,TDATE DATE)
RETURNS DIFF DECIMAL(10,8)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
DEFAULT SCHEMA NIT_SCN AS
BEGIN
SELECT MON_DIFF +
CASE WHEN :FDATE <= :TDATE THEN
CASE WHEN :FDATE = LAST_DAY(:FDATE) THEN
DAYS_BETWEEN(LFDATE,:TDATE)/(DAYS_BETWEEN(LFDATE,LAST_DAY(ADD_MONTHS(LFDATE,1))))
ELSE
DAYS_BETWEEN(LFDATE,:TDATE)/DAYS_BETWEEN(LFDATE,ADD_MONTHS(LFDATE,1))
END
ELSE
CASE WHEN :FDATE = LAST_DAY(:FDATE) THEN
DAYS_BETWEEN(LFDATE,:TDATE)/(DAYS_BETWEEN(LFDATE,LAST_DAY(ADD_MONTHS(LFDATE,-1)))) * -1
ELSE
DAYS_BETWEEN(LFDATE,:TDATE)/DAYS_BETWEEN(LFDATE,ADD_MONTHS(LFDATE,-1)) * -1
END
END INTO DIFF
FROM
(
SELECT ((TYEAR - FYEAR) * 12) + (TMON - FMON) AS MON_DIFF,
CASE WHEN :FDATE = LAST_DAY(:FDATE) THEN
LAST_DAY(ADD_MONTHS(:FDATE, (((TYEAR - FYEAR) * 12) + (TMON - FMON))))
ELSE
ADD_MONTHS(:FDATE, (((TYEAR - FYEAR) * 12) + (TMON - FMON)))
END AS LFDATE
FROM
(
SELECT MONTH(:FDATE) AS FMON,
YEAR(:FDATE) AS FYEAR,
CASE WHEN :FDATE < :TDATE AND :FDATE = LAST_DAY(:FDATE) AND :TDATE != LAST_DAY(:TDATE) THEN MONTH(:TDATE) - 1
WHEN :FDATE < :TDATE AND TO_CHAR(:TDATE,'DD') < TO_CHAR(:FDATE,'DD') THEN MONTH(:TDATE) - 1
WHEN :FDATE > :TDATE AND TO_CHAR(:TDATE,'DD') > TO_CHAR(:FDATE,'DD') THEN MONTH(:TDATE) + 1
ELSE MONTH(:TDATE)
END AS TMON,
YEAR(:TDATE) AS TYEAR
FROM DUMMY
)
);
END;
Regards,
Nithin