--表结构 CREATE TABLE [dbo].[ERPZJPhaseTime]( [id] [int] IDENTITY(1,1) NOT NULL, [bianhao] [int] NOT NULL, [phase] [int] NULL, [phasename] [nvarchar](200) COLLATE Chinese_PRC_CI_AS NULL, [starttime] [smalldatetime] NULL, [endtime] [smalldatetime] NULL, [days] [int] NULL, [bzstate] [int] NULL, [shstate] [int] NULL, [AchieveState] [int] NULL, [category] [int] NULL, [orderid] [int] NULL) --测试用数据 insert ERPZJPhaseTime (id,bianhao,phase,phasename,starttime,endtime,days,bzstate,shstate,AchieveState,category,orderid) values ( 2,2,1,NULL,'2012-07-04 00:00:00.000','2012-07-05 00:00:00.000',2,NULL,NULL,NULL,2,1) insert ERPZJPhaseTime (id,bianhao,phase,phasename,starttime,endtime,days,bzstate,shstate,AchieveState,category,orderid) values ( 3,2,2,NULL,'2012-07-06 00:00:00.000','2012-07-08 00:00:00.000',3,NULL,NULL,NULL,2,1) insert ERPZJPhaseTime (id,bianhao,phase,phasename,starttime,endtime,days,bzstate,shstate,AchieveState,category,orderid) values ( 4,2,3,NULL,'2012-07-10 00:00:00.000','2012-07-13 00:00:00.000',4,NULL,NULL,NULL,2,1) 要求:表中已有bianhao=2的3个时间段,它们是一个整体,也就是说表中原有数据bianhao相同的要按整体看待。现在我将要插入一行新的时间段,要求就是不能产生重复时间。如果重复,新增的时间段不变动,表中原有的时间将向后顺延。 --测试用代码 declare @starttime smalldatetime ,@endtime smalldatetime ,@days int ,@category int ,@effectrow int set @starttime ='2012/07/03';set @endtime='2012/07/05';set @days=3; set @bianhao=2; 以下内容是我想的思路,仅供参考。 先检测时间是否存在冲突(@starttime between starttime and endtime or @endtime between starttime and endtime),存在冲突则依情况一和二来处理。 情况一:starttime >=@startime,时间接着新增的时间向后移动;情况二:@starttime > starttime and @starttime <=endtime.将冲突所在行截为两段。
update a set starttime=dateadd(day,@days-days+1,starttime),endtime=dateadd(day,@days-days+1,endtime) from ERPzjphasetime as a where starttime>=@starttime and category=@category
--更新开始时间在表时间之内的部分insert into ERPzjphasetime(bianhao, phase,starttime,endtime,days,category, orderid) select bianhao, phase,DATEADD(day ,1,@endtime),DATEADD(day,@days,endtime),DATEDIFF(day,@starttime,endtime)+1,category, orderid+1 from ERPzjphasetime where @starttime > starttime and @starttime <=endtime and category=@categoryupdate a set days=DATEDIFF(day,starttime,@starttime), endtime=dateadd(day,-1, @starttime) from ERPzjphasetime as a where(@starttime between starttime and endtime) and category=@category
下午测试下,如果OK我给你话费
@happydaily: 这个只是个参考,话费什么的就免了,我也只是碰到新问题就试着解决下。
呵呵,太复杂了,大家都懒得看
做一个函数传入 相交或相近的两个原有开始结束时间点,还有新的开始结束时间点
总共传入6个时间参数 要REF的
返回 6个时间
把这个看成是线段
3条线合成一条
3条变2条
3条还是3条
- - 貌似还有2条相同 消掉? 你这个自己也有点乱啊
如果(1,3) (5,7)
插入(2,6)
要变成(1,1) (3,4) (7,7)
变成 (1,1) (2,6) (7,8) (9,11)
@happydaily:
如果(1,3) (5,7)
插入(2,7)呢
@happydaily: 你的算法有矛盾啊 原来有的 现在要插入不是要消掉么
你说变成(1,1) (2,6) (7,8) (9,11)
前面可以合起来直接(1,7) 后面多出来的是前面重复的那个留下来么?
@Xheart:
不合并,那个时间段是那个的,和新加入的不要合