1. 给定一个日期范围(一般是一个月,比如2009-03-01——2009-03-31),如何产生这样一个表  beg1         end1      beg2          end2     beg3         end3      beg4 end4 beg5 end5 beg6 end6
2009-02-23   2009-03-01  2009-03-02 2009-03-08 2009-03-09  2009-03-15……beg固定是周一,end固定是周日2.如何随机删除记录,比如beg1,end1范围内,满足flag=1的记录有三条,我要随机删除其中两条,只保留一条,请给个例子

解决方案 »

  1.   

    2009-02-23是2009-03-01那一天所在的周的周一不需要表结构了吧,beg1,end1这些你就当是日期类型变量。
    测试数据不是给了吗,2009-03-01   2009-03-31,结果也给了几周的了
      

  2.   

    一个表中固定包含了beg1-beg6以及end1-end6这12个字段?
      

  3.   

    是的,但有的月份,beg6,end6可能是空的
      

  4.   

    第一题参考:
    create proc sp_createtable
    @begdate datetime,
    @enddate datetime
    as 
    set nocount on
    select id=identity(int,1,1) into # from sysobjects
    declare @s varchar(8000)
    if object_id('tb') is not null drop table tb --这步会删除表,注意实际需要
    set @s='create table tb ('
    select @s=@s+quotename(convert(varchar(10),dateadd(dd,id-1,@begdate),120))+' varchar(20),'
    from # where id<=datediff(dd,@begdate,@enddate)+1
    select @s=left(@s,len(@s)-1)+')'
    exec(@s)
    drop table #
    goexec sp_createtable '2009-03-01','2009-03-31'
    select * from tb
      

  5.   

    1.
    create table test(
    beg1 datetime,end1 datetime,beg2 datetime,end2 datetime,beg3 datetime,end3 datetime,
    beg4 datetime,end4 datetime,beg5 datetime,end5 datetime,beg6 datetime,end6 datetime)
    goset datefirst 1declare @st datetime,@et datetime
    select @st='2009-03-01',@et='2009-03-31'declare @t table(dt datetime)
    insert into @t 
    select  
        dateadd(dd,num-7,@st)
    from 
        (select num=(select count(1) from sysobjects where id<t.id) from sysobjects t) a
    where
        dateadd(dd,num-7,@st)<=dateadd(dd,5,@et)insert into test
    select
        max(case when datediff(ww,b.dt,a.dt)=0 and datepart(dw,a.dt)=1 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=1 and datepart(dw,a.dt)=7 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=1 and datepart(dw,a.dt)=1 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=2 and datepart(dw,a.dt)=7 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=2 and datepart(dw,a.dt)=1 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=3 and datepart(dw,a.dt)=7 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=3 and datepart(dw,a.dt)=1 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=4 and datepart(dw,a.dt)=7 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=4 and datepart(dw,a.dt)=1 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=5 and datepart(dw,a.dt)=7 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=5 and datepart(dw,a.dt)=1 then a.dt end),
        max(case when datediff(ww,b.dt,a.dt)=6 and datepart(dw,a.dt)=7 then a.dt end)
    from
        @t a,(select min(dt) as dt from @t where datepart(dw,dt)=1) b
        
    select * from test
    /*
    beg1                                                   end1                                                   beg2                                                   end2                                                   beg3                                                   end3                                                   beg4                                                   end4                                                   beg5                                                   end5                                                   beg6                                                   end6                                                   
    ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ 
    2009-02-23 00:00:00.000                                2009-03-01 00:00:00.000                                2009-03-02 00:00:00.000                                2009-03-08 00:00:00.000                                2009-03-09 00:00:00.000                                2009-03-15 00:00:00.000                                2009-03-16 00:00:00.000                                2009-03-22 00:00:00.000                                2009-03-23 00:00:00.000                                2009-03-29 00:00:00.000                                2009-03-30 00:00:00.000                                2009-04-05 00:00:00.000
    */
    godrop table test
    go
      

  6.   

    我再说详细点,@tempzjk表永远只有1条记录。declare @tempzjk table(beg1 datetime,end1 datetime,beg2 datetime,end2 datetime,beg3 datetime,end3 datetime,beg4 datetime,end4 datetime,beg5 datetime,end5 datetime)declare @datebegin datetime,@dateend datetime
    select @datebegin='2009-03-01',@dateend ='2009-03-31'insert @tempzjk(beg1)
    select DATEADD(Day,1-(DATEPART(Weekday,@datebegin)+@@DATEFIRST-2)%7-1,@datebegin)我现在只知道beg1是这样写,后面的字段不知道该如何写,最好能1次insert,
    实在不行,可以update @tempzjk
      

  7.   

    --第一个.declare @dt1 as datetime
    set @dt1 = '2009-03-01'
    declare @dt2 as datetime
    set @dt2 = '2009-03-31'
    declare @i as int
    set @i = 0
    declare @j as int
    set @j = 0
    declare @k as int
    set @k = 0
    declare @beg as varchar(10)
    declare @end as varchar(10)
    declare @sql as varchar(8000)
    set @sql = 'create table tb('
    declare @val as varchar(8000)
    set @val = ''
    set @i = datepart(week , @dt1)
    if datepart(weekday , @dt2) = 1
       set @j = datepart(week , @dt2)
    else
       set @j = datepart(week , @dt2) + 1while @i <= @j
    begin
      set @beg = convert(varchar(10),DATEADD(wk,  DATEDIFF(wk,0,dateadd(day , @k*7 , @dt1)),0) - 7,120)
      set @end = convert(varchar(10),DATEADD(wk,  DATEDIFF(wk,0,dateadd(day , @k*7 , @dt1)),0) - 1,120)
      set @sql = @sql + '[beg' + cast(@k+1 as varchar) + '] datetime,'  
                      + '[end' + cast(@k+1 as varchar) + '] datetime,'
      set @val = @val + '''' + @beg + ''',''' + @end + '''' + ','  
      set @i = @i + 1 
      set @k = @k + 1
    end
    set @sql = left(@sql,len(@sql)-1) + ')'
    set @val = left(@val,len(@val)-1) exec(@sql)
    exec('insert into tb values('+ @val + ')')select * from tbdrop table tb/*
    beg1                                                   end1                                                   beg2                                                   end2                                                   beg3                                                   end3                                                   beg4                                                   end4                                                   beg5                                                   end5                                                   beg6                                                   end6                                                   
    ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------ 
    2009-02-23 00:00:00.000                                2009-03-01 00:00:00.000                                2009-03-02 00:00:00.000                                2009-03-08 00:00:00.000                                2009-03-09 00:00:00.000                                2009-03-15 00:00:00.000                                2009-03-16 00:00:00.000                                2009-03-22 00:00:00.000                                2009-03-23 00:00:00.000                                2009-03-29 00:00:00.000                                2009-03-30 00:00:00.000                                2009-04-05 00:00:00.000(所影响的行数为 1 行)*/
      

  8.   

    2.如何随机删除记录,比如beg1,end1范围内,满足flag=1的记录有三条,我要随机删除其中两条,只保留一条,请给个例子 不知道你问的什么?flag=1在哪里?
      

  9.   

    create table abc(dt datetime,flag int,empid int,num int)insert abc(dt,flag,empid,num)
    select '2009-02-23',1,1,0 union
    select '2009-02-24',1,1,1 union    
    select '2009-02-25',1,1,2 union
    select '2009-02-26',0,1,3 union
    select '2009-02-27',1,1,4 union
    select '2009-02-28',0,1,5 union
    select '2009-03-06',0,1,6 union
    我要的结果:  dt是在beg1和end1范围内的,并且flag=1的记录,我只保留一条(最好能随机),其他的不动
      

  10.   

    declare @b datetime,@e datetime
    select  @b='2009-03-01'
    ,@e='2009-03-31'
    declare @bmin datetime,@emax datetime
    select @bmin=dateadd(d,datepart(dw,@b)-7,@b)
       ,@emax=dateadd(d,8-datepart(dw,@e),@e)select  @bmin as beg1,@bmin+6 as end1
    ,@bmin+7 as beg2,@bmin+13 as end2
    ,@bmin+14 as beg3,@bmin+20 as end3
    ,@bmin+21 as beg4,@bmin+27 as end4
    ,@bmin+28 as beg5,@bmin+32 as end5
    ,@bmin+33 as beg6,@bmin+39 as end6
    /*
    beg1                    end1                    beg2                    end2                    beg3                    end3                    beg4                    end4                    beg5                    end5                    beg6                    end6
    ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
    2009-02-23 00:00:00.000 2009-03-01 00:00:00.000 2009-03-02 00:00:00.000 2009-03-08 00:00:00.000 2009-03-09 00:00:00.000 2009-03-15 00:00:00.000 2009-03-16 00:00:00.000 2009-03-22 00:00:00.000 2009-03-23 00:00:00.000 2009-03-27 00:00:00.000 2009-03-28 00:00:00.000 2009-04-03 00:00:00.000(1 行受影响)
    */
      

  11.   

    1、好像是想把一个月的所有周的起止日期放在一条记录?--declare @b1 datetime,@e1 datetime,@b2 datetime,@e2 datetime,@b3 datetime,@e3 datetime,@b4 datetime,@e4 datetime,@b5 datetime,@e5 datetime,@b6 datetime,@e6 datetimedeclare @b datetime,@e datetime
    set @b='2009-3-1'
    set @e='2009-3-31'declare @tb table(fd datetime)set DATEFIRST 1print datepart(weekday,@b)
    set @b=dateadd(day,1-datepart(weekday,@b),@b)while @b<=@e
    begin
    insert @tb values (@b)
    set @b=@b+6
    insert @tb values (@b)
    set @b=@b+1
    endselect * from @tb这是以行形式存储的,通过游标可以取到@b1..@e6即是列的形式了
    2、如果表有一个唯一的fid(id字段最好,不是id字段也行)delete tb where fd between beg1 and end1 and flag=1 and fid not in (
    select min(fid) from tb where fd between beg1 and end1 and flag=1
    )
      

  12.   


    你没考虑到 任何一个beg是不能大于 @e 的,且有的月份是没有beg6的