当前位置: 代码迷 >> Sql Server >> 诸位高人,看一下这SQL还能不能再优化一下
  详细解决方案

诸位高人,看一下这SQL还能不能再优化一下

热度:49   发布时间:2016-04-24 20:02:22.0
各位高人,看一下这SQL还能不能再优化一下
用于计算当年周次

select number 
,right(convert(varchar,case when year(dateadd(dd,(datepart(dw,dateadd(ww,(datepart(ww,cast(year(getdate()) as varchar)+'-1-1')-1)*-1, cast(year(getdate()) as varchar)+'-1-1'))-1)*-1
,dateadd(ww, (datepart(ww, cast(year(getdate()) as varchar)+'-1-1' )-number)*-1, cast(year(getdate()) as varchar)+'-1-1'))) < year(getdate())
then cast(year(getdate()) as varchar)+'-1-1'
else dateadd(dd,(datepart(dw,dateadd(ww,(datepart(ww,cast(year(getdate()) as varchar)+'-1-1')-1)*-1, cast(year(getdate()) as varchar)+'-1-1'))-1)*-1
,dateadd(ww, (datepart(ww, cast(year(getdate()) as varchar)+'-1-1' )-number)*-1, cast(year(getdate()) as varchar)+'-1-1')) 
end,102),5) + '~' +
 right(convert(varchar,case when year(dateadd(dd,(datepart(dw,dateadd(ww,(datepart(ww,cast(year(getdate()) as varchar)+'-1-1')-1)*-1, cast(year(getdate()) as varchar)+'-1-1'))-1)*-1
,dateadd(ww, (datepart(ww, cast(year(getdate()) as varchar)+'-1-1' )-number)*-1, cast(year(getdate()) as varchar)+'-1-1'))+6) > year(getdate())
then cast(year(getdate()) as varchar)+'-12-31'
else dateadd(dd,(datepart(dw,dateadd(ww,(datepart(ww,cast(year(getdate()) as varchar)+'-1-1')-1)*-1, cast(year(getdate()) as varchar)+'-1-1'))-1)*-1
,dateadd(ww, (datepart(ww, cast(year(getdate()) as varchar)+'-1-1' )-number)*-1, cast(year(getdate()) as varchar)+'-1-1'))+6 
end,102),5) as date_between
from master..spt_values
where type='p'
and number < datepart(ww,cast(year(getdate()) as varchar)+'-12-31')+1
and number > 0


水平有限,不知是否可以进一步优化,还请各路高人指点
优化 sql

------解决方案--------------------
函数用的太多了,没必要用那么多吧?漫山遍野的都是红色。
------解决方案--------------------
  WITH tt
              AS ( SELECT   DATEPART(wk,
                                     DATEADD(dd, m.number,
                                             DATEADD(yy,
                                                     DATEDIFF(yy, 0, GETDATE()),
                                                     0))) AS wk ,
                            DATEADD(dd, m.number,
                                    DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0)) AS dd
                   FROM     master..spt_values m
                   WHERE    type = 'P'
                 ),
            t1
              AS ( SELECT   wk ,
                            CONVERT(VARCHAR, DATEPART(mm, dd)) + '.'
                            + CONVERT(VARCHAR, DATEPART(dd, dd)) AS cdd
                   FROM     TT
                   WHERE    DATEDIFF(yy, dd, GETDATE()) = 0
  相关解决方案