我表里面有两个时间段
1:2009-01-01   至 2009-04-30
2:2009-05-01 至 2009-12-31
我想在这个时间段里面算钱。
时间在1里面每个月的钱是100元
时间在二里面每个月的钱是50元我现在想写个类来算某个时间段内的钱。比如2008-10-01 至 2009-03-01
像这个时间段有效时间是有两个月,即1,2月 所得的钱是200
又如 2008-10-01 至 2010-01-01
这个就算1,2这两个时间段的钱总和
1时间段为4*100
2时间段为8*50 
大家给个思路怎么设计,或者给伪代码也行 尽量能详细 谢谢

解决方案 »

  1.   

    我说的可能不够详细。是这样的我有一张表里面放有算钱的时间段
    表数据项大概是:
    序号,类别(类别有两个:医疗为1,工伤为2),执行开始时间,执行结束时间,缴费基数,缴费比率等。
    某个时间段内的钱=时间月数×基数×比率我已经写出来了,不过还不够好,大概是这样,谁有更简洁的方法吗?
    package com.sx.ldlsc.zqzpgl.ywcl.sbbt;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;import com.sx.db.DbCommon;
    import com.sx.ldlsc.zqzpgl.common.DBFactory;
    import com.sx.ldlsc.zqzpgl.valuebean.sbbt.SbbtJsVB;
    import com.sx.support.dba.dbSQLResult;
    public class Sbbtbz {

    // 医疗保险
    private  final String YLBX = "1";
    // 工伤保险
    private  final String GSBX = "2";

    public Sbbtbz(){

    }
    public DbCommon db = DBFactory.getDBCommonInstance("sbbt","sbbtservice","v1.0"); /**
     * @param kssj 开始时间
     * @param jssj 结束时间
     * @param bxlx 保险类别 1为医疗保险,2为工伤保险
     * @return
     */ public int getBtMoney(String kssj,String jssj,String bxlx){

    String sql =" SELECT bxlx,nd,zxkssj,zxjssj,jfjs,jfbl FROM " +
        " (SELECT bxlx,nd,zxkssj,zxjssj,jfjs,jfbl FROM zpgl_bxcsb " +
        " WHERE zxkssj<='"+jssj+"' AND bxlx='"+bxlx+"' " +
        " UNION  SELECT bxlx,nd,zxkssj,zxjssj,jfjs,jfbl FROM zpgl_bxcsb " +
        " WHERE zxjssj>= '"+kssj+"' AND bxlx='"+bxlx+"') y ";
    dbSQLResult sr = db.querySql(sql);

             /**
     * 计算出这个时间段内算钱的段数 
     * */
    List list = new ArrayList();
    if(sr!=null && sr.getRows()>0){
    for(int i=0;i<sr.getRows();i++){
    SbbtJsVB vb = new SbbtJsVB();
    vb.setBxlx(sr.getData()[i][0]);
    vb.setNd(sr.getData()[i][1]);
    vb.setZxkssj(sr.getData()[i][2]);
    vb.setZxjssj(sr.getData()[i][3]);
    vb.setJfjs(sr.getData()[i][4]);
    vb.setJfbl(sr.getData()[i][5]);
                    list.add(vb);
    }
             }
     Iterator it = list.iterator();
     int size = list.size(); // 时间段数量
     int num = 0; //定义钱总数
     int i = 1;
     while(it.hasNext()){
     SbbtJsVB vb = (SbbtJsVB)it.next();
     if(i==1){
     num += getMoney(Integer.parseInt(vb.getJfjs()),Integer.parseInt(vb.getJfbl()),getMonths(kssj,vb.getZxjssj()));
     }else if(i!=1 && i!=size){
     num += getMoney(Integer.parseInt(vb.getJfjs()),Integer.parseInt(vb.getJfbl()),getMonths(vb.getZxkssj(),vb.getZxjssj()));
     }else if(i==size){
     num += getMoney(Integer.parseInt(vb.getJfjs()),Integer.parseInt(vb.getJfbl()),getMonths(vb.getZxkssj(),jssj));
     }
     i++;
     }
    i=0;
    return num;
    }
    /**
     * @param begin 开始时间
     * @param end  结束时间
     * @return
     */
    public int getMonths(String begin,String end){

    /*开始日期年*/
        int beginYear = Integer.parseInt(begin.substring(0, 4)); 
        /*开始日期月*/
    int beginMonth = Integer.parseInt(begin.substring(4, 6)); 
    /*开始日期天*/
    int beginDay = Integer.parseInt(begin.substring(6,8)); 
    /*结束日期年*/
    int endYear = Integer.parseInt(end.substring(0, 4));
    /*结束日期月*/
    int endMonth = Integer.parseInt(end.substring(4, 6)); 
    /*结束日期天*/
    int endDay = Integer.parseInt(end.substring(6,8)); 
    int amount = (endYear - beginYear) * 12 + (endMonth - beginMonth); 
    if (amount != 0 && endDay < beginDay) amount = amount - 1; 

    return amount; 
    }
    //计算钱数
    /**
     * @param js 基数
     * @param bl 比率
     * @param ys 月数
     * @return
     */
    public int getMoney(int js,int bl,int ys){

    return (js)*(bl)*ys;
    }
    public  String getGSBX() {
    return GSBX;
    }
    public  String getYLBX() {
    return YLBX;
    }
    }
      

  2.   

    20090131 至20090201怎么算?答改写了个,不过不是针对db的 public static void main(String[] args) {
    GregorianCalendar inv_start1 = new GregorianCalendar(2009, 1, 1, 0, 0);
    GregorianCalendar inv_end1 = new GregorianCalendar(2009, 4, 30, 0, 0);
    GregorianCalendar inv_start2 = new GregorianCalendar(2009, 5, 1, 0, 0);
    GregorianCalendar inv_end2 = new GregorianCalendar(2009, 12, 31, 0, 0);
    int tax1 = 100;
    int tax2 = 50; GregorianCalendar start = new GregorianCalendar(2008, 1, 31, 0, 0);
    GregorianCalendar end = new GregorianCalendar(2009, 2, 1, 0, 0);
    int sum1 = dateCheck(start, end, inv_start1, inv_end1, tax1);
    int sum2 = dateCheck(start, end, inv_start2, inv_end2, tax2);
    if (sum1 < 0) {
    sum1 = 0;
    }
    if (sum2 < 0) {
    sum2 = 0;
    }
    int sum = sum1 + sum2;
    System.out.println(sum1);
    System.out.println(sum2);
    System.out.println(sum);
    } public static int dateCheck(GregorianCalendar start, GregorianCalendar end,
    GregorianCalendar invStart, GregorianCalendar invEnd, int tax) {
    int full = invEnd.get(Calendar.MONTH) - invStart.get(Calendar.MONTH)
    + 12
    * (invEnd.get(Calendar.YEAR) - invStart.get(Calendar.YEAR))
    + (invEnd.get(Calendar.DATE) - invStart.get(Calendar.DATE) + 1)
    / invEnd.get(Calendar.DAY_OF_MONTH);
    int former = start.get(Calendar.MONTH) - invStart.get(Calendar.MONTH)
    + 12 * (start.get(Calendar.YEAR) - invStart.get(Calendar.YEAR))
    + (start.get(Calendar.DATE) - invStart.get(Calendar.DATE) + 1)
    / invEnd.get(Calendar.DAY_OF_MONTH);
    int latter = invEnd.get(Calendar.MONTH) - end.get(Calendar.MONTH) + 12
    * (invEnd.get(Calendar.YEAR) - end.get(Calendar.YEAR))
    + (invEnd.get(Calendar.DATE) - end.get(Calendar.DATE) + 1)
    / invEnd.get(Calendar.DAY_OF_MONTH);
    if (former < 0) {
    former = 0;
    }
    if (latter < 0) {
    latter = 0;
    }
    System.out.println(former);
    System.out.println(latter);
    System.out.println(full);
    return (full - former - latter) * tax;
    }