首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

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

2013-10-31 
各位高人,看一下这SQL还能不能再优化一下用于计算当年周次select number ,right(convert(varchar,case whe

各位高人,看一下这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


                 )
        SELECT  wk ,
                MIN(cdd) + '~' + MAX(cdd) AS datebetween
        FROM    T1
        GROUP BY wk


[解决办法]
看得头有点大。
[解决办法]


--格式化了一下,疯了

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


[解决办法]
这语句,都不用看了。
直接说需求,重新写吧。
维护的人,会死的。
[解决办法]
不用写这么复杂的哈,你看看是不是这样:


;with t
as
(
select number,
       dateadd(day,number,datename(year,getdate()) +'-01-01') as day,
       datepart(ww,dateadd(day,number,datename(year,getdate()) +'-01-01')) as week_day
       
from master..spt_values
where type='p'
and number <= datediff(day,
                      datename(year,getdate()) +'-01-01',
                      datename(year,getdate()) +'-12-31'
                      )
and number >= 0
),

tt
as
(
select number,
       day,
       week_day,
       substring(convert(varchar(10),(min(day) over(partition by week_day)),120),6,5) as week_first_day,


       substring(convert(varchar(10),(max(day) over(partition by week_day)),120),6,5) as week_last_day
from t
)

select distinct week_day as number,
       replace(week_first_day+'~'+week_last_day,'-','.') as date_between
from tt

热点排行