我要生成一个职称与周岁年龄结构表,我用下面的存储过程的话速度没有问题,但岁数是直接用@sj查询的时候减去出生日期得到的,这就得出来的岁数不是周岁。我在网上查到到了一个得到周岁的函数,因此我把datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')改为dbo.getage(csrqi,'''+CONVERT(varchar(50),@sj,120)+'''),但这样执行的速度却很慢(大概5秒)不知道有什么其他方法可以改进。周数的函数为:CREATE FUNCTION GetAge (@birthday datetime, @today datetime) RETURNS int AS BEGIN declare @bd int select @bd =(cast(convert(char( 8 ),@today,112) as int) - cast(convert(char( 8 ),@birthday,112) as int))/10000 return @bd END存储过程为:
set @sqlstr='select zcxxb.id,zcxxb.zcmcheng,
[25nl]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<26 then 1 else 0 end),
[26_30nl]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<31 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=26 then 1 else 0 end), 
[31_35nl]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<36 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=31 then 1 else 0 end),
[36_40nl]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<41 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=36 then 1 else 0 end),
[41_45nl]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<46 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=41 then 1 else 0 end),
[46_50nl]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<51 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=46 then 1 else 0 end),
[51_55nl]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<56 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=51 then 1 else 0 end),
[56_60nl]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=56 then 1 else 0 end),
[25nln]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<26 and xbie=''女'' then 1 else 0 end),
[26_30nln]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<31 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=26 and xbie=''女'' then 1 else 0 end), 
[31_35nln]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<36 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=31 and xbie=''女'' then 1 else 0 end),
[36_40nln]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<41 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=36 and xbie=''女'' then 1 else 0 end),
[41_45nln]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<46 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=41 and xbie=''女'' then 1 else 0 end),
[46_50nln]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<51 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=46 and xbie=''女'' then 1 else 0 end),
[51_55nln]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')<56 and datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=51 and xbie=''女'' then 1 else 0 end),
[56_60nln]=sum(case when datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')>=56 and xbie=''女'' then 1 else 0 end)
from zcxxb left outer join #zcnl on zcxxb.id=#zcnl.ppzcheng
group by zcxxb.id,zcxxb.zcmcheng
order by zcxxb.id
'
execute(@sqlstr+' drop table #zcnl')

解决方案 »

  1.   

    如果只算年份,datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')

    datediff(year,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')如果加月份,日期要判断,肯定慢.
      

  2.   

    如果只算年份,datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')

    datediff(year,csrqi,'''+CONVERT(varchar(50),@sj,120)+''')如果加月份,日期要判断,肯定慢.datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''') - (case when month(csrqi) > month(@sj) then - 1 then 0 end)
    datediff(yy,csrqi,'''+CONVERT(varchar(50),@sj,120)+''') - (case when month(csrqi) = month(@sj) and day(csrqi) > day(@sj) then - 1 then 0 end)
      

  3.   


    create  FUNCTION [dbo].[F_GetAge] (@birthday datetime, @today datetime)
    RETURNS int AS  
    BEGIN 
        declare @bd int
        select @bd =(cast(convert(char( 8 ),@today,112) as int) - cast(convert(char( 8 ),@birthday,112) as int))/10000
        return @bd
    END--今天 日期是2011-11-9
    select dbo.F_GetAge('1995-11-9',getdate())
    select dbo.F_GetAge('1995-11-10',getdate())/*
    -----------
    16
    (1 行受影响)
    -----------
    15
    (1 行受影响)
    */