数据库表:
| Id | StartDate | EndDate | Value |
| 1 | 2007-01-01 | 2007-01-05 | 1 |
| 2 | 2007-01-08 | 2007-01-10 | 2 |
每条数据中的开始日期,结束日期构成一个时间段,表中所有数据的时间段不重叠。任意插入一条数据,要求调整原表中数据的开始日期和结束日期,使表中原有数据和新插入数据不会有时间段的重叠。
例如,插入一条时间段为2007-01-04至2007-01-08的数据,表中最终结果为:
| Id | StartDate | EndDate | Value |
| 1 | 2007-01-01 | 2007-01-03 | 1 |
| 2 | 2007-01-09 | 2007-01-10 | 2 |
| 3 | 2007-01-04 | 2007-01-08 | 3 |
我的做法是先将表中所有与待插入数据时间段重叠的数据取出放入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;
}
博客探讨了如何在数据库表中确保所有时间段不重叠的问题。当插入新记录时,需要调整原有记录的日期以消除任何重叠。具体方法是识别并处理与新插入时间段重叠的记录,通过调整这些记录的开始和结束日期来防止冲突。
551

被折叠的 条评论
为什么被折叠?



