最近老是遇到这样的问题
表结构zk
id(自增) sp_id(商品ID)  zkl(折扣率)   beg(起始日期)  end(结束日期)
   1 1    1           20060705        20060710   
   2 1    1           20060715        20060720
要求是插入一条记录时日期重叠的话要做一下分段处理
假如插一条
  . 1    1           20060701        20060725
这条数据应该分成下面几条记录
  . 1    1           20060701        20060704
  . 1    1           20060711        20060714
  . 1    1           20060721        20060725
插入后表zk内容如下
id(自增) sp_id(商品ID)  zkl(折扣率)   beg(起始日期)  end(结束日期)
   1 1    1           20060705        20060710   
   2 1    1           20060715        20060720
   . 1    1           20060701        20060704
   . 1    1           20060711        20060714
   . 1    1           20060721        20060725
总结:也就是说某个商品在某一天只能有一个折扣率
感觉这样设计有点不合理,不知道各位老大们有没有好的设计方案,请赐教

解决方案 »

  1.   

    gahade() ( ) 信誉:100  2006-07-19 15:13:00  得分: 0  
     
     
       应该是某一商品在某一时段只能有一个折扣率,即折扣时段不能交叉.楼主是插入时判断时段不交叉不就可以了吗?
      
     
    -----------------------------------------------
    是的
      

  2.   

    LouisXIV(夜游神) ( ) 信誉:100  2006-07-19 15:20:00  得分: 0  
     
     
       如果发生了交叉,沿用旧数据还是更新成新数据?可以考虑用触发器来更新
    ------------------------------------
    怎么用触发器更新,给个思路,谢谢  
     
      

  3.   

    可以考虑用触发器来更新
    ------------------------------------
    怎么用触发器更新,给个思路,谢谢___________________________________________他的思路可能是将你原来的插入数据的一系列复杂过程写到trigger中,以后你insert时不用考虑是否分段, 算法如你原来的插入算法.
      

  4.   

    业务表应当有个时间字段的,刚才楼上的那些说用标志位,我觉得可以把标志位用日期来表示,

    基础表
      折扣率  开始时间    结束时间    失效时间
       0.1   2006-7-1    2006-7-5    2006-7-3
          0.2   2006-7-3    2006-7-20   NULL
    业务表
        业务发生时间
        2006-7-2        
        2006-7-4    
    通过以上几个信息就搞定啦。具体设计与实现是你的事啦,给个思路。
      

  5.   

    如果发生了交叉,沿用旧数据还是更新成新数据?可以考虑用触发器来更新
    -------------------------------------------
    交叉的话,取并集
    -------------------------------------------
    取并集,如何取并集?一个时间段不是只能有一个折扣率吗?
    我个人觉得,可以拿今天日期进行比较,如今天是7.19,要进行调整折扣率了,就把相应产品check一下,结束日期大于今天的,均改为今天,再插入一条新记录,起始日期是7.20,实际上是7.20生效。对于已经过去的时间,再进行设置也没有意义。
      

  6.   

    楼上的可能误会楼主的意思了比如A供应商的苹果2006-07-01至2006-07-05期间打9折,一共卖了100块钱,则应给供应商付款90元.
    然后A供应商的苹果又在2006-07-06至2006-07-10期间打一折,一共卖了100,则应给供应商付款10元.
    则商场应在2006-07-01至2006-07-10应总共付A供应商的苹果钱是100元.如果苹果折扣只有一条记录的话,那就(100+100)*0.1,只付20了!所以是要记录下商品某一段时间内的折扣率