【问题标题】:Date difference in mysql based on 360 daysmysql中基于360天的日期差异
【发布时间】:2014-09-08 07:41:11
【问题描述】:

我从事一个金融项目,我需要计算拖欠天数的差异。如果我使用 mysql 的 datediff() 方法,那么它会返回基于 365 天的结果。我需要基于 360 天的结果。如果使用下面的 sql 查询

select datediff('20140908','20130908') from dual;

mysql 返回日期差异 365。这是实际的日期差异,但在会计/财务计算中,差异正好是一年(360 天)。这就是我要的。结果应该是 360 而不是 365。 目前我想使用美国标准。

【问题讨论】:

  • '我需要基于 360 天的结果。'请详细说明
  • 您首先需要定义您想使用的 360 天 标准(例如美国或欧洲),然后您应该展示使用您已经尝试过的内容,并说明在哪里你的问题是。
  • 我也遇到过这个问题。这是一个解决方案:experts-exchange.com/questions/21912790/DATEDIFF360.html

标签: mysql


【解决方案1】:

为了得到和 Excel 一样的结果,我在 MySQL 中找到了以下代码:

    select case 
when (day(Startdate)>=30 or Startdate=last_day(Startdate) then
    case
    when(day(Enddate)>=30) then
        30*(12*(year(Enddate)-year(Startdate))+month(Enddate)-month(Startdate))
    else
        30*(12*(year(Enddate)-year(Startdate))+month(Enddate)-month(Startdate))+days(Enddate)-30
    end
else
    30*(12*(year(Enddate)-year(Startdate))+month(Enddate)-month(Startdate))+days(Enddate)-days(Startdate)
end

【讨论】:

    【解决方案2】:

    使用

    TO_DAYS(date2) - To_DAYS(date1)
    

    它返回 date1 和 date2 之间的天数。然后你就可以对结果做你需要的了。

    【讨论】:

    • 嗨,Petr,此查询也返回 365 天。
    【解决方案3】:

    sdate = 从日期开始 edate = 至今

    这计算两个日期之间的天数,考虑到一个月是 30 天,1 年是 360 天,并检查日期是否在月末,例如从 1.1.2019 到 28.2.2019 = 60 天等。

    为 1 个月或 1 年,日期应为前一天,因此 1.1 - 31.1 = 30 天,1.1 - 1.2 = 31 天

    选择最伟大的( 0, (YEAR(DATE_ADD(edate, INTERVAL 1 DAY)) - YEAR(sdate)) * 360 + (MONTH(DATE_ADD(edate, INTERVAL 1 DAY)) - MONTH(sdate)) * 30 + ( IF(DAYOFMONTH(DATE_ADD(edate, INTERVAL 1 DAY)) = DAYOFMONTH(LAST_DAY(DATE_ADD(edate, INTERVAL 1 DAY))), 30, DAYOFMONTH(DATE_ADD(edate, INTERVAL 1 DAY))) - IF(DAYOFMONTH(sdate) = DAYOFMONTH(LAST_DAY(sdate)), 30, DAYOFMONTH(sdate)) )

    【讨论】:

      【解决方案4】:

      这里已经很晚了,但发布我的解决方案以供将来参考

      CREATE FUNCTION `DAYS360_UDF`(sdate DATE, edate DATE)
      RETURNS INTEGER
      DETERMINISTIC
      CONTAINS SQL
      BEGIN
          DECLARE sdate_360 INTEGER;
          DECLARE edate_360 INTEGER;
          SET sdate_360 = ( YEAR(sdate) * 360 ) + ( (MONTH(sdate)-1)*30 ) + DAY(sdate);
          SET edate_360 = ( YEAR(edate) * 360 ) + ( (MONTH(edate)-1)*30 ) + DAY(edate);
          RETURN edate_360 - sdate_360;
      END
      

      用法 - select DAYS360_UDF('20130908', '20140908')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 2023-04-05
        • 2015-03-23
        相关资源
        最近更新 更多