我测试了下:
select case  when isdate('2005'+'02'+'29')=1 then DATENAME(weekday,cast('2005'+'02'+'29' as datetime))
 else '0' end--报错:从 char 数据类型到 datetime 数据类型的转换导致 datetime 值越界。
这可能是因为在语句执行前,编译时,会先把“'2005'+'02'+'29' ”转换成日期,因为没这个日期,所以会先报错了。select case  when isdate('2005'+'02'+'28')=1 then DATENAME(weekday,cast('2005'+'02'+'28' as datetime))
 else '0' end
--成功:星期一

解决方案 »

  1.   

    恩,但是得作判断啊,因为我前面是要有
    delcare @year char(4),@month char(2),@month2 char(2)的
    也就是说得遍历整个月,必须要作判断,否则直接写就更加错了
    正确的情况就不用说了,就是这种不存在的情况才做的判断,但是判断似乎没有作用,各位仁兄有何高见?
      

  2.   

    这也就是加“isdate()”的目的阿
      

  3.   

    to: xingfu2000(幸福)
    语句本身没问题,但在编译的时候会因为日期不存在而产生异常,你最好控制一下别传个不存在的日期给他,因为当转换的时候是肯定会出错的
      

  4.   

    先判定该月有多少天吧。。
    select day(dateadd(dd,-1,'2005-03-01'))
    取上与的最大天数就是下月的一号减一天。
      

  5.   

    declare @year char(4),@year2 char(4),@month char(2),@month2 char(2)
    set @year='2004'
    set @year2='2004'
    set @month='09'
    set @month2='10'
    SET DATEFIRST 1
    select @year,@year2,@month,@month2
           ,datepart(weekday,convert(datetime,@year+@month+'21'))
           ,datepart(weekday,convert(datetime,@year+@month+'22'))
           ,datepart(weekday,convert(datetime,@year+@month+'23'))
           ,datepart(weekday,convert(datetime,@year+@month+'24'))
           ,datepart(weekday,convert(datetime,@year+@month+'25'))
           ,datepart(weekday,convert(datetime,@year+@month+'26'))
           ,datepart(weekday,convert(datetime,@year+@month+'27'))
           ,datepart(weekday,convert(datetime,@year+@month+'28'))
           ,case isdate(@year+@month+'29') when 1 
    then
     case when (datepart(weekday,convert(datetime,@year+@month+'28'))+1)>7
     then convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))-6)
     else convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))+1)
            end
    else ''
    end
           ,case isdate(@year+@month+'30') when 1
     then
     case when (datepart(weekday,convert(datetime,@year+@month+'28'))+2)>7
     then convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))-5)
     else convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))+2)
          end
     else ''
     end
           ,case isdate(@year+@month+'31') when 1 
    then
     case when (datepart(weekday,convert(datetime,@year+@month+'28'))+3)>7
     then convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))-4)
     else convert(char(1),datepart(weekday,convert(datetime,@year+@month+'28'))+3)
            end
    else ''
    end
           ,datepart(weekday,convert(datetime,@year2+@month2+'01'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'02'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'03'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'04'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'05'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'06'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'07'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'08'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'09'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'10'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'11'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'12'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'13'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'14'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'15'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'16'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'17'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'18'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'19'))
           ,datepart(weekday,convert(datetime,@year2+@month2+'20'))