我是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