Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果有人出生在21世纪的sql server上,则为逻辑_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

如果有人出生在21世纪的sql server上,则为逻辑

如果有人出生在21世纪的sql server上,则为逻辑,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我建立了一个计算年龄的函数,根据瑞典ssn,我得到的所有个人ID都是10个数字,格式为650101-1234。到目前为止,在我的函数中,它确实计算年龄,但只计算1900年至1999年出生的人的年龄我如何添加计算2000年及以后出生的人的年龄的可能性 这是我的函数代码 ALTER function [dbo].[Function_AGE] ( @IdNr varchar(13) ) returns int as begin Declare @Calc i

我建立了一个计算年龄的函数,根据瑞典ssn,我得到的所有个人ID都是10个数字,格式为
650101-1234
。到目前为止,在我的函数中,它确实计算年龄,但只计算1900年至1999年出生的
人的年龄
我如何添加计算2000年及以后出生的
人的年龄的可能性

这是我的函数代码

ALTER function [dbo].[Function_AGE] 
(
     @IdNr varchar(13)

) 
     returns int
     as

begin

  Declare @Calc int 

  Set @IdNr = (Select Case when LEN(@IdNr) > 11 
  then cast(left(@IdNr, 8) as date)
  else cast('19'+left(@IdNr,6) as date) end) 

  set @Calc = (select datediff(year,@IdNr,getdate())) 

Return @Calc
end  

如果前两位数字介于00和14之间,且第七位的字符不是加号,则此人出生于1999年之后。所以您可以添加if-then-else逻辑来测试它

这里有一个关于如何确定方括号的未经测试的示例,它远非完美,只是作为一个提示——它可能包含错误:)


这是我的答案,我已经测试过了,效果非常好!谢谢你给我的建议,这对我很有帮助。非常感谢

ALTER function [dbo].[AGE_Function] 
(
@IdNr varchar(13)

) 
returns int
as

begin
If SUBSTRING(@IdNr,1,2) between '20'+'00' and DATEPART(YY,GETDATE()) 
     and LEFT(@IdNr,7) =   '-'
  Begin

   Declare @Calc int 

   Set @IdNr = (Select Case when LEN(@IdNr) > 11 
   then cast(left(@IdNr, 8) as date)
   else cast('20'+left(@IdNr,6) as date) end) 

   set @Calc = (select datediff(year,@IdNr,getdate())) 
end

Else
Begin
   Set @IdNr = (Select Case when LEN(@IdNr) > 11 
   then cast(left(@IdNr, 8) as date)
   else cast('19'+left(@IdNr,6) as date) end) 

   set @Calc = (select datediff(year,@IdNr,getdate())) 
end    
   Return @Calc
end 

如果一个人的出生年份在2000年之后,你能举一个ssn的例子吗?问题可能是你怎么知道这个人是2000年之后出生的?我猜
650101
表示出生日期是1965年1月1日。2001年1月1日的出生日期是什么样子的?这是一样的,如果一个人超过100岁XXXXXX-XXXX,那么“-”将被“+”替换。这意味着2000年以后出生的人将拥有相同的个人IDformat@mhasan对于昨天出生的人来说,它看起来像是140401-NNNX(NNN是一个序列num,X是一个校验和)。@t-clausen.dk你是对的,我没有为它编写任何逻辑,因为我目前无法访问我的SQL Server,我只是想添加一些信息来确定这个人是否在1999年以后出生。但是当你知道逻辑时,只有一小步可以做到:)我已经得到答案,很快就会打印出来!谢谢你的提示:9@Darka计算准确的年龄在sql server中从来都不是一小步!根据你的计算,2013年12月31日出生的人第二天将是1岁真的!它不注意细节,只计算年份,尽管我还必须补充这一逻辑
ALTER function [dbo].[AGE_Function] 
(
@IdNr varchar(13)

) 
returns int
as

begin
If SUBSTRING(@IdNr,1,2) between '20'+'00' and DATEPART(YY,GETDATE()) 
     and LEFT(@IdNr,7) =   '-'
  Begin

   Declare @Calc int 

   Set @IdNr = (Select Case when LEN(@IdNr) > 11 
   then cast(left(@IdNr, 8) as date)
   else cast('20'+left(@IdNr,6) as date) end) 

   set @Calc = (select datediff(year,@IdNr,getdate())) 
end

Else
Begin
   Set @IdNr = (Select Case when LEN(@IdNr) > 11 
   then cast(left(@IdNr, 8) as date)
   else cast('19'+left(@IdNr,6) as date) end) 

   set @Calc = (select datediff(year,@IdNr,getdate())) 
end    
   Return @Calc
end