你看看这个,主要是取得本月的最后一天,该怎么写!
其思想就是取得下个月的第一天,然后减去一天,就是本月的最后一天declare @begin datetime,  @end datetime ,@y1 datetime
select @begin='2005-02-05',@end='2006-01-08'
select @y1= dateadd(dd,-1,cast(cast(year(@begin) as varchar)+'-'+cast(month(@begin)+1 as varchar)+'-'+'01' as datetime))
select convert(varchar(10),@begin,120)+'到'+convert(varchar(10),@y1,120)

解决方案 »

  1.   

    declare @begin datetime,  @end datetime ,@y1 datetime
    declare @r table (Startdate datetime,enddate datetime)select @begin='2005-02-05',@end='2006-01-08'
    select @y1= dateadd(d,-1,dateadd(m,1,convert(varchar(8),@begin,120) +'01'))while (@end>@y1)
    begin
    insert into @r
    select @begin,@Y1 select @begin=dateadd(d,1,@y1)
    select @y1=  dateadd(d,-1,dateadd(m,1,convert(varchar(8),@begin,120) +'01'))
    endinsert into @r
    select @begin,@endselect * from @r
      

  2.   

    感谢ReViSion(和尚) 
    可是我中间日期只要一条2005-03-01   2005-12-31
      

  3.   

    把ReViSion(和尚)  的改了一下,差不多可以了,不知能否优化一下代码?
    declare @begin datetime,  @end datetime ,@y1 datetime,@y datetime
    declare @r table (Startdate datetime,enddate datetime)
    declare @i int
    select @begin='2005-02-01',@end='2005-02-28'
    select @y1= dateadd(d,-1,dateadd(m,1,convert(varchar(8),@begin,120) +'01'))
    set @i=0
    while (@end>@y1)
    begin
    if @i=0
    begin
    insert into @r select @begin,@Y1
    select @y=dateadd(d,1,@y1)
    endselect @begin=dateadd(d,1,@y1)select @y1=  dateadd(d,-1,dateadd(m,1,convert(varchar(8),@begin,120) +'01'))
    select @i=@i+1
    endif @i>1 
    insert into @r select @y,@Y1insert into @r
    select @begin,@endselect * from @r
      

  4.   

    CREATE  FUNCTION dbo.DividedByMonth(@DateFm DATETIME,@DateTo DATETIME)
    returns @dates TABLE(MonthStart DATETIME,MonthEnd DATETIME)
    AS
    BEGIN
    --输入的日期相差不足一月则返回一行记录
    IF datediff(m,@DateFm,@DateTo)=0
    BEGIN
    INSERT INTO @dates VALUES(@DateFm,@DateTo)
    RETURN
    END
    --输入的日期相差一月则返回两行记录
    IF datediff(m,@DateFm,@DateTo)=1
    BEGIN
    INSERT INTO @dates VALUES(@DateFm, dateadd(d,-1,CONVERT(VARCHAR(8),@DateTo,120)+'01'))
    INSERT INTO @dates VALUES(CONVERT(VARCHAR(8),@DateTo,120)+'01',@DateTo)
    RETURN
    END
    --输入的日期相差一月以上则返回三行记录
    IF datediff(m,@DateFm,@DateTo)>=2
    BEGIN
    INSERT INTO @dates VALUES(@DateFm, 
    dateadd(d,-1,dateadd(m,1,CONVERT(VARCHAR(8),@DateFm,120) +'01')))
    INSERT INTO @dates VALUES(CONVERT(VARCHAR(8),@DateTo,120)+'01',@DateTo)
    INSERT INTO @dates SELECT MIN(MonthEnd)+1,MAX(MonthStart)-1 FROM @dates
    RETURN
    END
    RETURN
    END调用举例:
    SELECT * FROM dbo.DividedByMonth('2005-02-05','2006-01-08') ORDER BY 1
    SELECT * FROM dbo.DividedByMonth('2005-02-05','2005-10-08') ORDER BY 1
    SELECT * FROM dbo.DividedByMonth('2005-02-05','2007-1-08') ORDER BY 1
    SELECT * FROM dbo.DividedByMonth('2005-02-05','2005-02-18') ORDER BY 1