我要生成一个职称与周岁年龄结构表,我用下面的存储过程的话速度没有问题,但岁数是直接用@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')
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')
或
datediff(year,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)
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 行受影响)
*/