时间段调整不重叠算法

博客探讨了如何在数据库表中确保所有时间段不重叠的问题。当插入新记录时,需要调整原有记录的日期以消除任何重叠。具体方法是识别并处理与新插入时间段重叠的记录,通过调整这些记录的开始和结束日期来防止冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

IdStartDateEndDateValue
12007-01-012007-01-051
22007-01-082007-01-102

每条数据中的开始日期,结束日期构成一个时间段,表中所有数据的时间段不重叠。任意插入一条数据,要求调整原表中数据的开始日期和结束日期,使表中原有数据和新插入数据不会有时间段的重叠。

例如,插入一条时间段为2007-01-04至2007-01-08的数据,表中最终结果为:

 

IdStartDateEndDateValue
12007-01-012007-01-031
22007-01-092007-01-102
32007-01-042007-01-083

我的做法是先将表中所有与待插入数据时间段重叠的数据取出放入ArrayList中,然后对这个List进行处理。具体算法如下:

 

/// <summary>
///  时间段重叠数据处理函数
/// </summary>
/// <param name="inResourceRPList">处理前房价信息列表</param>
/// <param name="inNewRP">待插入房价信息</param>
/// <returns>
/// ArrayList
/// </returns>

private ArrayList RoomPriceDivide(ArrayList inResourceRPList, RoomPriceNormalVo inNewRP) 
{
    Log.Debug(
"RoomPriceNormalLogic:RoomPriceDivide Start");
    
//得到一个源列表的副本
    ArrayList tempList = (ArrayList)inResourceRPList.Clone();
 
    
//遍历源列表的副本
    foreach(RoomPriceNormalVo oldRP in tempList)
    
{
        
//如果老数据的结束时间落在新数据起始与结束时间之间
        if (oldRP.EndTime >= inNewRP.StartTime && oldRP.EndTime <= inNewRP.EndTime)
        
{
            
//设置老数据的结束时间为新数据开始日期的前一天
            oldRP.EndTime = inNewRP.StartTime.AddDays(-1);
            
//如果当前列表中没有新数据,则插入
            if (!inResourceRPList.Contains(inNewRP))
            
{
                inResourceRPList.Insert(inResourceRPList.IndexOf(oldRP) 
+ 1, inNewRP);
            }

            
            
//如果老数据结束时间更改后,开始时间大于结束时间,则删掉该数据
            if (oldRP.StartTime > oldRP.EndTime)
            
{
                inResourceRPList.Remove(oldRP);
            }

        }

        
//如果老数据起始时间落在新数据起始与结束时间之间
        else if (oldRP.StartTime >= inNewRP.StartTime && oldRP.StartTime <= inNewRP.EndTime)
        
{
            
//设置老数据的开始日期为新数据结束日期的后一天
            oldRP.StartTime = inNewRP.EndTime.AddDays(1);
            
//如果当前列表中没有新数据,则插入
            if (!inResourceRPList.Contains(inNewRP))
            
{
                inResourceRPList.Insert(inResourceRPList.IndexOf(oldRP) 
+ 1, inNewRP);
            }

        }

        
//如果老数据的时间段包含新数据的时间段---最终会有三条数据生成
        else if (oldRP.StartTime <= inNewRP.StartTime && oldRP.EndTime >= inNewRP.EndTime)
        
{
            RoomPriceNormalVo lastRP 
= new RoomPriceNormalVo();
            
//复制一个新的房价信息Vo
            object dest = lastRP as Object;
            RoomCommon.CopyObject(
ref dest, oldRP);
            lastRP 
= (RoomPriceNormalVo)dest;
            
//设置第一个时间段的结束日期为新数据的开始日期的前一天
            oldRP.EndTime = inNewRP.StartTime.AddDays(-1);

            
//如果开始日期大于结束日期则删除该数据
            if (oldRP.StartTime > oldRP.EndTime)
            
{
                inResourceRPList.Remove(oldRP);
            }


            
//如果当前列表中没有新数据,则插入
            if (!inResourceRPList.Contains(inNewRP))
            
{
                inResourceRPList.Add(inNewRP);
            }


            
//设置最后一个时间段的开始日期为新数据的结束日期的后一天
            lastRP.StartTime = inNewRP.EndTime.AddDays(1);

            
//如果开始日期小于等于结束日期,则插入
            if (lastRP.StartTime <= lastRP.EndTime)
            
{
                inResourceRPList.Add(lastRP);
            }

        }

    }


    Log.Debug(
"RoomPriceNormalLogic:RoomPriceDivide End");
    
return inResourceRPList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值