SQL查询,用于从今天起满18岁的人

SQL查询,用于从今天起满18岁的人,sql,sql-server,Sql,Sql Server,我是SQL新手,正在尝试编写一个查询,根据当前日期返回那些已满18岁的联系人。我考虑了下面的查询,但我不确定如何添加“和日期等于今天”的部分 我很感激我可能使事情变得比需要的更复杂 SELECT date_of_birth FROM contacts WHERE ((DATEDIFF(Year,date_of_birth,GETDATE())>'17') AND (DATEDIFF(Year,date_of_birth,GETDATE())<'19'))

我是SQL新手,正在尝试编写一个查询,根据当前日期返回那些已满18岁的联系人。我考虑了下面的查询,但我不确定如何添加“和日期等于今天”的部分

我很感激我可能使事情变得比需要的更复杂

    SELECT date_of_birth 
    FROM contacts
    WHERE ((DATEDIFF(Year,date_of_birth,GETDATE())>'17') AND 
(DATEDIFF(Year,date_of_birth,GETDATE())<'19')) 

出生日期大于17但小于19

请改用DATEADD。你可以用负数进行减法

如果您的date_of_birth字段以date only格式存储,您只需将其添加18年,并与今天的日期进行比较

DATEADDYEAR,18,出生日期=CONVERTDATE,GETDATE

因为GETDATE会得到DATETIME结果,所以您可以将其转换为DATE

下面是测试逻辑的示例代码

DECLARE @date_of_birth DATE = '03/18/1996'

SELECT CASE WHEN DATEADD(YEAR, 18, @date_of_birth) = CONVERT(DATE, GETDATE()) THEN 'TRUE'
            ELSE 'FALSE'
       END
如果你想得到所有18岁的人。表示他们已经年满18岁但还没有年满19岁,您可以使用DATEDIFF,在下面的测试中,在第一个select语句中,两列都将返回“TRUE”,但在我将DOB更改为“3/17/1996”后,第二个select语句中的第二个case返回“TRUE”


只要考虑到这一年不会给你带来正确的结果,你也需要考虑一天和一个月。请检查此项,我们在应用程序中使用此项已有一段时间:

SELECT date_of_birth 
    FROM contacts
    WHERE (FLOOR(DATEDIFF(DAY, date_of_birth,GETDATE()) / 365.25) between 17 and 18 

您可以尝试此简单查询,而不是使用两个条件:

Select date_of_birth from contacts
where datediff(yy,date_of_birth,getdate()) = 18 

为什么不能使用WHERE DATEDIFFYear、date_of_birth、GETDATE=18您是指今天年满18岁的人,还是指今天年满18但尚未年满19岁的人?指今天年满18岁的人。此外,如果您对date_of_birth列有任何索引,请在WHERE谓词中将函数应用于该列本身,您可能会中断索引,最终会进行表扫描。您可以通过查看执行计划来验证这一点。
Select date_of_birth from contacts
where datediff(yy,date_of_birth,getdate()) = 18