首页 新闻 会员 周边 捐助

[100元话费]来个精通数学和SQL的高手指导下一个SQL语句

1
悬赏园豆:10 [已解决问题] 解决于 2012-07-07 21:45
--表结构
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
 
happydaily的主页 happydaily | 菜鸟二级 | 园豆:260
提问于:2012-07-02 11:05
< >
分享
最佳答案
0
declare  @starttime1 smalldatetime ,@endtime1 smalldatetime ,@days1 int ,@bianhao1 INT;
set @starttime1 ='2012/07/04';set @endtime1='2012/07/06';set @days1=3; set @bianhao1=2;

    DECLARE @id INT;
    DECLARE @bianhao int;
    DECLARE @phase int;
    DECLARE @phasename nvarchar(200);
    DECLARE @starttime smalldatetime;
    DECLARE @endtime smalldatetime;
    DECLARE @days int;
    DECLARE @bzstate int;
    DECLARE @shstate int;
    DECLARE @AchieveState int;
    DECLARE @category int;
    DECLARE @orderid INT;
    DECLARE @OP INT;
    DECLARE @NUM INT;
    DECLARE @pendtime smalldatetime;
    SET @OP=0;
    SET @NUM=0;
    DECLARE C1 CURSOR
FOR SELECT * FROM ERPZJPhaseTime WHERE bianhao=2 ORDER BY starttime
OPEN C1;
FETCH NEXT FROM C1 INTO @id,@bianhao,@phase,@phasename,@starttime,@endtime,@days,@bzstate,@shstate,@AchieveState,@category,@orderid
 WHILE @@FETCH_STATUS=0
 BEGIN
 IF @OP>0
 BEGIN
 IF @NUM>0
 BEGIN
   UPDATE ERPZJPhaseTime SET starttime=DATEADD(DAY,@NUM,@starttime),endtime=DATEADD(DAY,@NUM,@endtime) WHERE id=@id;
 END
 END 
 ELSE IF @OP<=0
 BEGIN
  IF DATEDIFF(dd,@starttime1,@starttime)>=0
  BEGIN
    INSERT INTO ERPZJPhaseTime (bianhao,phase,phasename,starttime,endtime,days,bzstate,shstate,AchieveState,category,orderid)  values ( @bianhao1,NULL,NULL,@starttime1,@endtime1,@days1,NULL,NULL,NULL,2,1);
SET @OP=1;
IF DATEDIFF(dd,@endtime1,@starttime)<=0
BEGIN
  SET @NUM=DATEDIFF(dd,@starttime,@endtime1)+1;
  UPDATE ERPZJPhaseTime SET starttime=DATEADD(DAY,@NUM,@starttime),endtime=DATEADD(DAY,@NUM,@endtime) WHERE id=@id;
  SET @OP=1;
END
  END
  ELSE IF (DATEDIFF(dd,@starttime1,@starttime)<0 AND DATEDIFF(dd,@starttime1,@endtime)>=0)
  BEGIN
    INSERT INTO ERPZJPhaseTime (bianhao,phase,phasename,starttime,endtime,days,bzstate,shstate,AchieveState,category,orderid)  values ( @bianhao1,NULL,NULL,@starttime1,@endtime1,@days1,NULL,NULL,NULL,2,1)
SET @OP=1;
UPDATE ERPZJPhaseTime SET endtime=DATEADD(DAY,-1,@starttime1),days=DATEDIFF(dd,starttime,DATEADD(DAY,-1,@starttime1))+1 WHERE id=@id;
SET @NUM=@days1+DATEDIFF(dd,@starttime1,@endtime)+1;
INSERT INTO ERPZJPhaseTime (bianhao,phase,phasename,starttime,endtime,days,bzstate,shstate,AchieveState,category,orderid)  values (@bianhao,@phase,@phasename,DATEADD(DAY,@days,@starttime1),DATEADD(DAY,@days,@endtime),DATEDIFF(dd,DATEADD(DAY,@days,@starttime1),DATEADD(DAY,@days,@endtime))+1,@bzstate,@shstate,@AchieveState,@category,@orderid)
  END
  
 END

 FETCH NEXT FROM C1 INTO @id,@bianhao,@phase,@phasename,@starttime,@endtime,@days,@bzstate,@shstate,@AchieveState,@category,@orderid
 END
CLOSE C1;
DEALLOCATE C1;

SELECT * FROM ERPZJPhaseTime WHERE bianhao=2 ORDER BY starttime
收获园豆:10
crow0176 | 菜鸟二级 |园豆:247 | 2012-07-03 18:06

下午测试下,如果OK我给你话费

happydaily | 园豆:260 (菜鸟二级) | 2012-07-04 10:31

@happydaily: 这个只是个参考,话费什么的就免了,我也只是碰到新问题就试着解决下。

crow0176 | 园豆:247 (菜鸟二级) | 2012-07-04 18:06
其他回答(2)
-1

呵呵,太复杂了,大家都懒得看

[秦时明月] | 园豆:738 (小虾三级) | 2012-07-02 11:07
0

做一个函数传入 相交或相近的两个原有开始结束时间点,还有新的开始结束时间点

总共传入6个时间参数 要REF的

返回 6个时间 

把这个看成是线段

3条线合成一条

3条变2条

3条还是3条

- - 貌似还有2条相同 消掉?  你这个自己也有点乱啊

如果(1,3) (5,7)

插入(2,6)

要变成(1,1)  (3,4) (7,7)

Xheart | 园豆:178 (初学一级) | 2012-07-02 11:42

变成 (1,1) (2,6) (7,8) (9,11)

支持(0) 反对(0) happydaily | 园豆:260 (菜鸟二级) | 2012-07-02 12:19

@happydaily: 

如果(1,3) (5,7)

插入(2,7)呢

支持(0) 反对(0) 鹏@ | 园豆:111 (初学一级) | 2012-07-02 12:29

@happydaily: 你的算法有矛盾啊 原来有的 现在要插入不是要消掉么

你说变成(1,1) (2,6) (7,8) (9,11)

前面可以合起来直接(1,7) 后面多出来的是前面重复的那个留下来么?

 

支持(1) 反对(0) Xheart | 园豆:178 (初学一级) | 2012-07-02 13:55

@Xheart: 

不合并,那个时间段是那个的,和新加入的不要合

支持(0) 反对(0) happydaily | 园豆:260 (菜鸟二级) | 2012-07-02 14:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册