SQL ServeR语言 SQL 查询,适用于从今天开始年满 18 岁的人



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

我意识到我可能把它弄得比它需要的更复杂。

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

date_of_birth大于17但小于19

考虑到年份不能得到正确的结果,您还需要考虑日期和月份。看看这个,我们已经在我们的应用程序中使用了一段时间:

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

尝试使用DATEADD代替。你可以用负数来做减法

http://technet.microsoft.com/en-us/library/ms186819.aspx

如果您的date_of_birth字段仅存储在日期格式中,您可以将18年添加到它并与今天的日期进行比较。

DATEADD(YEAR,18,date_of_birth) = CONVERT(DATE,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,在接下来的测试中,在第一个选择语句中,两列都将返回'TRUE',但在我将DOB更改为'3/17/1996'后,只有第二个情况在第二个选择返回'TRUE'

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
        ,CASE WHEN DATEDIFF(YEAR, @date_of_birth, GETDATE()) = 18 THEN 'TRUE'
                ELSE 'FALSE'
        END
SET @date_of_birth = '03/17/1996'
SELECT CASE WHEN DATEADD(YEAR, 18, @date_of_birth) = CONVERT(DATE, GETDATE()) THEN 'TRUE'
            ELSE 'FALSE'
        END
        ,CASE WHEN DATEDIFF(YEAR, @date_of_birth, GETDATE()) = 18 THEN 'Today18'
                ELSE 'FALSE'
        END

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

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

最新更新