数据库有一个sign_dates数据类型为datetime的字段,现在有一个需求,
我现在页面有2个输入框,选择时间范围,比如我选择了2010年9月5号到2010年9月7号的时间段
那么在数据库里就要生成5,6,7号3天的日期记录,这么用sql该怎么写,我的意思是用一天sql语句!

解决方案 »

  1.   


    declare @t1 datetime,@t2 datetime,@t3 datetime
    set @t1 = '2010-01-01'
    set @t2 = '2010-04-01'
    set @t3 = @t1
    while datediff(d,@t3,@t2) >=0
    begin 
    select @t3 = dateadd(d,1,@t3)
    --print convert(varchar(10),@t3,120)
                    insert into tb values(convert(varchar(10),@t3,120),其他列值)
    end
    可以注释掉插入语句,去掉print语句的注释看效果。
      

  2.   

    select dateadd(day,number,'20100905')
    from master..spt_values
    where type='P' and dateadd(day,number,'20100905')<='20100907'
    /*
    -----------------------
    2010-09-05 00:00:00.000
    2010-09-06 00:00:00.000
    2010-09-07 00:00:00.000
    */
      

  3.   

    楼上的我现在insert最重要,select是次要的!
      

  4.   


    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author: <Author,,wcd>
    -- Create date: <Create 2010.9.2>
    -- Description: <Description ,请假一天以上生成多条签到表记录,>
    -- =============================================
    CREATE PROCEDURE [CreateManySignByLeave] 
    -- Add the parameters for the stored procedure here
    @beginTime datetime,
    @endTime datetime,
    @type int  --请假类型
    AS
    BEGIN
    DECLARE @signTime datetime
    set @signTime=@beginTime
    while datediff(d,@signTime,@endTime) >=0
    begin 
    select @signTime = dateadd(d,1,@signTime)
    insert into l_sign(sign_date,in_state,af_state,out_state) 
    values(convert(varchar(10),@signTime,120),@type,@type,@type)
    endEND
    GO为什么我的datetime类型,当我选择起始时间是2010-9-4,结束时间2010-9-7
    它会插入的是2010-9-5到2010-9-8的时间呢?
      

  5.   

    datediff(d,@signTime,@endTime) >=0  ==》datediff(d,@signTime,@endTime) >0