none
求日期算法 RRS feed

  • 问题

  • 现在我有两个日期,比如,2010-04-20  2010-05-22

    如果现在我以天为基数,那我按天累加插入到数据库。插入32条数据

    但是现在我以月为基数,那怎么算呢?不足一月按一月算。包括闰年,一月30天或者31天不固定。视当月而定

    2010年4月20日 8:57

答案

  • 不好意思,是我表达不清楚,5月20 和 6月23 如果以月为基数的话,往数据库里查两天数据,5.20-6.20 6.21-6.23  天的话就插入34条记录。

    如果是这样的话,就不必考虑闰年这些东西了吧。每年12个月,更简单些:

    if( secondDate.year - firstDate.year >0 ){           

         return (secondDate.day - firstDate.day >0) ? (secondDate.year - firstDate.year - 1) * 12 + (12-firstDate.month+1) +secondDate.month) : ((secondDate.year - firstDate.year)*12 + (12-firstDate.month) + secondDate.month);

    }

    else

    {

         return (secondDate.day - firstDate.day >0) ? ( secondDate.month - firstDate.month +1) : ( secondDate.month - firstDate.month );

    }

    • 已编辑 络绎 2010年4月20日 10:35 拼写错误
    • 已标记为答案 FindNocile 2010年4月21日 6:14
    2010年4月20日 10:30

全部回复

  • 还是不很明白你所说的意思?根据你举得例子,“以月为基数”是指按月累加插入到数据库,每月插入当月天数条数据么?若是的话,举两个日期(firstDate and secondDate)为例,三个优先级:

    if(secondDate.year - firstDate.year > 0){

           添加中间几年的数据(要判断闰年的情况);//【==1也不用添加】

          再添加(12 - firstDate.month+1) 和 (secondDate.month)的数据;//月的数据

         //由于不足一月按一月算,故日期也不用考虑了

    }

    else

    {

                添加(secondDate.month - firstDate.month)的数据;

                再添加secondDate.month本月的数据;

    }

    例如:

    1)2010-04-20   2010-05-22

    执行的是else语句,05-04 = 1, 故添加4月份的天数(30)条数据,再考虑天数5月份的数据(31)条;

    2)2010-04-20  2011 - 05 -22

    则执行了if语句,year相差1,那么加入12 - 4 + 1 = 9, 即(4, 5, 6, 7,8, 9, 10, 11, 12 )月的数据;

    再假如secondDate.year即(1, 2, 3, 4, 5)5月的数据。

    3)2010-04-20 2012 -05 -22

    也执行了if语句,year相差2,加入中间的一年(2011)年的数据;其后续和2)一样了。

    对于你的描述,我在“以月为基数”和“不足一月按一月算”上不是很明白。如5月20 和 6月14是两月还是一月,如只是一月的话天数又按四月的天数算还是五月的天数算呢?不知道是我理解错误还是你未表述清楚。

     

    2010年4月20日 9:57
  • 还是不很明白你所说的意思?根据你举得例子,“以月为基数”是指按月累加插入到数据库,每月插入当月天数条数据么?若是的话,举两个日期(firstDate and secondDate)为例,三个优先级:

    if(secondDate.year - firstDate.year > 0){

           添加中间几年的数据(要判断闰年的情况);//【==1也不用添加】

          再添加(12 - firstDate.month+1) 和 (secondDate.month)的数据;//月的数据

         //由于不足一月按一月算,故日期也不用考虑了

    }

    else

    {

                添加(secondDate.month - firstDate.month)的数据;

                再添加secondDate.month本月的数据;

    }

    例如:

    1)2010-04-20   2010-05-22

    执行的是else语句,05-04 = 1, 故添加4月份的天数(30)条数据,再考虑天数5月份的数据(31)条;

    2)2010-04-20  2011 - 05 -22

    则执行了if语句,year相差1,那么加入12 - 4 + 1 = 9, 即(4, 5, 6, 7,8, 9, 10, 11, 12 )月的数据;

    再假如secondDate.year即(1, 2, 3, 4, 5)5月的数据。

    3)2010-04-20 2012 -05 -22

    也执行了if语句,year相差2,加入中间的一年(2011)年的数据;其后续和2)一样了。

    对于你的描述,我在“以月为基数”和“不足一月按一月算”上不是很明白。如5月20 和 6月14是两月还是一月,如只是一月的话天数又按四月的天数算还是五月的天数算呢?不知道是我理解错误还是你未表述清楚。

     


    不好意思,是我表达不清楚,5月20 和 6月23 如果以月为基数的话,往数据库里查两天数据,5.20-6.20 6.21-6.23  天的话就插入34条记录。
    2010年4月20日 10:15
  • 很简单的问题

    你设置一个日期变量,然后

    将开始日期赋值给日期变量

    循环(如果日期变量大于 结束日期)

    循环开始

    插入数据1条

    日期变量+1天(addday(1))

    循环结束

    结束的时候就能插入实际的天数。


    family as water
    2010年4月20日 10:20
  • 不好意思,是我表达不清楚,5月20 和 6月23 如果以月为基数的话,往数据库里查两天数据,5.20-6.20 6.21-6.23  天的话就插入34条记录。

    如果是这样的话,就不必考虑闰年这些东西了吧。每年12个月,更简单些:

    if( secondDate.year - firstDate.year >0 ){           

         return (secondDate.day - firstDate.day >0) ? (secondDate.year - firstDate.year - 1) * 12 + (12-firstDate.month+1) +secondDate.month) : ((secondDate.year - firstDate.year)*12 + (12-firstDate.month) + secondDate.month);

    }

    else

    {

         return (secondDate.day - firstDate.day >0) ? ( secondDate.month - firstDate.month +1) : ( secondDate.month - firstDate.month );

    }

    • 已编辑 络绎 2010年4月20日 10:35 拼写错误
    • 已标记为答案 FindNocile 2010年4月21日 6:14
    2010年4月20日 10:30