使用 select 查询中的值声明一个变量

Declaring a variable with a value from select query

DECLARE @age DATETIME
SET @age = (GETDATE() - emp.Birthdate)

SELECT 
    emp.BusinessEntityID, emp.BirthDate, @age
FROM 
    HumanResources.Employee AS emp
WHERE 
    emp.OrganizationLevel > = 3 
    AND ((GETDATE() - emp.Birthdate) BETWEEN '1930-01-01 00:00:00.000' AND '1940-01-01 00:00:00.000')

如您所见,这行不通,我希望显示 30-40 岁人群的年龄以及他们的 ID、生日和年龄。声明@age 是我的问题。我尝试使用 substring(getdate...), 2, 2) 但它似乎不起作用。有任何想法吗?谢谢

目前您将值设置为 @age

SET @age = (GETDATE() - emp.Birthdate)

没有emp.

您可以简单地执行以下查询:

SELECT emp.BusinessEntityID, emp.BirthDate, (GETDATE() - emp.Birthdate) AS Age
FROM HumanResources.Employee AS emp
WHERE emp.OrganizationLevel > = 3 AND
      (GETDATE() - emp.Birthdate) BETWEEN '1930-01-01 00:00:00.000' AND '1940-01-01 00:00:00.000')

您可以使用 Datediff 函数找出两个日期之间的确切差异

SELECT 
     datediff(yyyy,GETDATE(),date)
FROM 
     [PRGX_AS_SandBox].[dbo].[Test_SO]

首先,您不能设置具有多个值的标量变量。 其次,为此您根本不需要变量。 你可以简单地这样做:

SELECT BusinessEntityID, BirthDate, DATEDIFF(Year, BirthDate, GETDATE()) As Age
FROM HumanResources.Employee 
WHERE OrganizationLevel > = 3 
AND DATEDIFF(Year, BirthDate, GETDATE()) BETWEEN 30 AND 40

注意:这不会给出确切的年龄。要获得准确的年龄,您可以使用 this post. I think the best answer there is this answer by dotjoe

中的答案

我认为您正在尝试获取 30 到 40 岁之间的员工,您可以简单地使用 DateDiff 函数来执行以下查询:

SELECT BusinessEntityID,BirthDate,DATEDIFF(YEAR,BirthDate,GETDATE()) AS Age 
FROM HumanResources.Employee 
WHERE DATEDIFF(YEAR,BirthDate,GETDATE()) BETWEEN 30 AND 40 
ORDER BY Age ASC    

无需在查询中使用变量。您可以按照以下方式简单地执行此操作:

SELECT t.BusinessEntityID, t.BirthDate, t.Age
FROM
(SELECT emp.BusinessEntityID, emp.BirthDate, CAST(datediff(DAY, emp.Birthdate, GETDATE()) / (365.23076923074) as int) as 'Age'
FROM HumanResources.Employee AS emp
WHERE emp.OrganizationLevel > = 3) t
WHERE t.Age >= 30 and t.Age <=40