Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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
Sql 试图计算出生日期_Sql_Sql Server - Fatal编程技术网

Sql 试图计算出生日期

Sql 试图计算出生日期,sql,sql-server,Sql,Sql Server,我有一张有300人的表格,需要根据他们的出生日期计算他们截至2017年1月4日的年龄。我知道我缺少填充@dob变量的功能,因此无法找到它。以下是我所拥有的: Declare @dob datetime Declare @cutoff datetime set @cutoff = '2017-04-01' Select dob, FLOOR((CAST (@cutoff AS INTEGER) - CAST(@dob AS INTEGER)) / 365.25) AS Age, F

我有一张有300人的表格,需要根据他们的出生日期计算他们截至2017年1月4日的年龄。我知道我缺少填充@dob变量的功能,因此无法找到它。以下是我所拥有的:

Declare @dob  datetime

Declare @cutoff datetime

set @cutoff = '2017-04-01'

Select dob, FLOOR((CAST (@cutoff AS INTEGER) - CAST(@dob AS INTEGER)) / 365.25) AS Age,   
 FROM  [PGADCP].[dcp].[person] p

不要试图手动计算完整的年份数,而是使用带有
year
参数的函数:

SELECT
    p.dob
,   DATEDIFF(year, p.dob, @cutoff) AS AgeAsOfCutoff  
FROM  [PGADCP].[dcp].[person] p

请注意,您根本不需要
@dob
变量,因为
dob
的值来自
[person]
表中相应的列。

这在SQL Server中很复杂。您需要做的是减去三个月零一天,然后使用从“2016-12-31”起的
datediff()

即:

select p.dob,
       datediff(year, dateadd(month, -3, dob), '2016-12-31') as AgeAtCutoff
原因是
datediff()
统计年份边界。想必,你不想给十二月出生的人加上一岁

另一种方法是近似方法:

select datediff(day, dob, '2017-04-01') / 365.25

这在大多数情况下都很有效。

这里有一种计算年龄的方法:

DECLARE @cutoff datetime = '20170401';
SELECT 
    (CAST(CONVERT(char(8), @cutoff, 112) AS int) -
    CAST(CONVERT(char(8), dob, 112) AS int)) /10000 AS Age
FROM [PGADCP].[dcp].[person];

这应该能告诉你他们离截止日期的确切年龄

declare @asat date = '2017-01-01'

SELECT   (DATEDIFF(HOUR, date_of_birth, @asat) / 8766) AS [Age] 
from myPeople
试验


这是简单的数学。从2017年减去出生年份。然后检查出生月/日是否在04年1月之前,因为在这种情况下,您必须减去一年,因为还没有到那一年的生日

select 
  dob, 
  2017 - year(dob) - case when '01/04' > convert(char(5), dob, 1) then 1 else 0 end as age
from pgadcp.dcp.person;

使用DateDiff函数怎么样?请注意,并非所有年份的天数都相同。因此,使用365.25进行计算只是一个近似值。您可能会面临计算一年太少的情况。@vmd1310
DATEDIFF
有什么问题?为什么要创建自己的算术?
select 
  dob, 
  2017 - year(dob) - case when '01/04' > convert(char(5), dob, 1) then 1 else 0 end as age
from pgadcp.dcp.person;