要不怎么判断一个月有多少个周一呢?谢谢!!!

解决方案 »

  1.   

    帮帮忙吧,各位大哥,不是很难吧
    可不可以出一声嘛,唉!
      

  2.   

    fyear、fmonth是varchar型,famount是int型:select * from tttfyear fmonth famount     
    ----- ------ ----------- 
    2002  1      100
    2002  2      100
    2002  3      100
    2002  4      100
    2002  5      100
    2002  12     200
    2002  9      200
    2002  7      200
    2002  11     200
    2002  6      300
    2002  8      300
    2002  10     300select  fyear,fmonth, 
    case 
    (
    --最后一个周一所在星期
     datepart(wk,
       dateadd(d,
         1-datepart(dw,
           dateadd(d,-1,dateadd(mm,1,cast(fyear+'-'+fmonth+'-1' as datetime)))
                    ),
         dateadd(d,-1,
           dateadd(mm,1,cast(fyear+'-'+fmonth+'-1' as datetime))
                )
               )
              ) 
     -
    --第一个周一所在星期
     datepart(wk,
       case when datepart(dw,fyear+'-'+fmonth+'-1')=1 
            then cast(fyear+'-'+fmonth+'-1' as datetime) 
    else dateadd(d,8-datepart(dw,fyear+'-'+fmonth+'-1'),fyear+'-'+fmonth+'-1') 
            end 
             ) 
     +1
    --得出本月有几个周一
    )
    when 4 
    then famount*35/30 
    else famount*30/35 
    end  
    as famountfrom ttt
    order by cast(fmonth as int)不知道这样的格式是不是看得清楚点,我自己都晕了~~~可能有更简单的方法吧。其实我觉得不如用一个表来存放这样的数据:
    年度     月份     有几个周一
    2002     1         4
    2002     2         4
    ....
    建这个视图时与这个表关联就行了。
    这样可能还好做些,也比较好看懂,可能速度也会快些。做一个这样的表也不麻烦了。
    上面我的写法是可以得到结果,但真是难懂难看。
      

  3.   

    谢谢,慢慢研究先,呵呵~~~~~~