2

嗨,我一直在获取与当月不包括日期的日期的正确差异时遇到问题。

即,如果运行查询的月份是 2013 年 3 月

那么以下应该是结果

EXECUTION_DATE,EXEC_DIFF
13 年 1 月 1 日至 2 月 1 日
2013 年 1 月 31 日,2
2013 年 1 月 30 日,2

但是使用下面的 sql 语句我得到

EXECUTION_DATE,EXEC_DIFF
13 年 1 月 1 日至 2 月 1 日
2013 年 1 月 31 日,2
13 年 1 月 30 日,1
select EXECUTION_DATE,
       floor(MONTHS_BETWEEN (trunc(sysdate,'MM')-1, EXECUTION_DATE))+1 "EXEC_DIFF"
from V_CERT_LIST  
WHERE EXECUTION_DATE < TO_DATE('02/02/2013','DD/MM/YYYY') 
ORDER BY EXECUTION_DATE DESC

请有人能把我说得对吗?我已经用这个头疼了一段时间了

谢谢

4

3 回答 3

4
select EXECUTION_DATE,
       MONTHS_BETWEEN (trunc(sysdate,'MM'), trunc(EXECUTION_DATE,'MM')) "EXEC_DIFF"
from V_CERT_LIST  
WHERE EXECUTION_DATE < TO_DATE('02/02/2013','DD/MM/YYYY') 
ORDER BY EXECUTION_DATE DESC
于 2013-03-22T14:17:29.453 回答
1

不寻找分数但无法理解months_between有什么问题?据我了解,当月执行时间无关紧要 - 1 月 31 日或 1 月 30 日......如您的示例所示,1 月和 3 月之间的差异仍然是 2 个月。我可以在查询中添加更多天数,但 mo_betw。仍然是一样的......:

SELECT to_char(exec_date, 'DD-MON-YYYY') exec_date, MONTHS_BETWEEN(run_date, exec_date) months_btwn
 FROM
 (
 SELECT to_date('01/03/2013', 'DD/MM/YYYY') run_date
     , Add_Months(Trunc(sysdate,'YEAR'),Level-1) exec_date -- first day of each month
   FROM dual
 CONNECT BY LEVEL <= 3
 )
/


EXEC_DATE   MONTHS_BTWN
------------------------
 01-JAN-2013    2
 01-FEB-2013    1
 01-MAR-2013    0
于 2013-03-22T14:29:23.633 回答
0

Months_Between具有复杂的逻辑,将月份中的某天考虑在内。

也许你想要的是这样的:

select EXECUTION_DATE,
       ((year(sysdate)*12+month(sysdate)) - (year(execution_date)*12 + month(execution_date))
       ) as Exec_Diff
from V_CERT_LIST  
WHERE EXECUTION_DATE < TO_DATE('02/02/2013','DD/MM/YYYY') 
ORDER BY EXECUTION_DATE DESC

这会将年/月组合转换为自 0 时间以来的月数,然后减去结果。

于 2013-03-22T14:16:02.383 回答