oracle函数就像excel中的days360一样

时间:2010-06-11 04:30:28

标签: oracle excel

是否有任何oracle函数会返回两个日期之间的天数,例如excel中的days360函数?


DAYS360: “返回基于360天年份(12个30天月份)的两个日期之间的天数,用于某些会计计算。如果您的会计系统基于12天30天,请使用此功能帮助计算付款个月。

如果开始日期是一个月的最后一天,它将等于同月的第30天。如果结束日期是一个月的最后一天,并且开始日期早于一个月的30日,则结束日期将等于下个月的第一天;否则结束日期将等于同月的30日。“

1 个答案:

答案 0 :(得分:4)

在Oracle中,我们可以对日期进行简单的算术运算。或者,我们可以将差异转换为INTERVAL数据类型:

SQL> select id
  2         , start_date
  3         , end_date
  4         , (end_date - start_date) as arith_diff
  5         , (end_date - start_date) DAY TO SECOND as ds_interval
  6  from t42
  7  /


    ID START_DATE           END_DATE             ARITH_DIFF DS_INTERVAL
------ -------------------- -------------------- ---------- --------------------
   111 11-FEB-2010 05:44:52 01-MAR-2010 08:10:18 18.1009954 +18 02:25:26.000000
   222 15-APR-2010 10:50:46 19-MAY-2010 01:44:08 33.6203935 +33 14:53:22.000000
   333 01-JUN-2010 00:00:00 31-AUG-2010 00:00:00         91 +91 00:00:00.000000
   444 11-FEB-2010 00:00:00 01-MAR-2010 00:00:00         18 +18 00:00:00.000000

SQL>

修改

  

“在days360函数中返回20. in   你的代码是18.10。我想要的是一个   应该完全正常工作的功能   像days360“

好的,Excel函数days360()根据十二三十天的一年计算两个日期之间的差异。没有Oracle内置功能可以做到这一点。 Phil Singer编写了自己的PL / SQL实现:find it here。另请务必阅读his follow-up piece。当然菲尔的功能确实给你想要的结果:

SQL> select id
  2         , start_date
  3         , end_date
  4         , days360(start_date, end_date) as days360
  5  from t42
  6  /

        ID START_DATE           END_DATE                DAYS360
---------- -------------------- -------------------- ----------
       111 11-FEB-2010 05:44:52 01-MAR-2010 08:10:18         20
       222 15-APR-2010 10:50:46 19-MAY-2010 01:44:08         34
       333 01-JUN-2010 00:00:00 31-AUG-2010 00:00:00         90
       444 11-FEB-2010 00:00:00 01-MAR-2010 00:00:00         20

SQL>