如何从SQL语句中返回一个人的生日';s的年龄

本文关键字:生日 一个人的 SQL 语句 返回 | 更新日期: 2023-09-27 18:25:48

我正试图在ASP.net中创建一个过滤器,用户可以在其中选择某个年龄,SQL语句将根据"DOB"(出生日期)字段返回当前处于该年龄的所有用户。

例如,假设我有一个变量age,它当前包含23。我在数据库中有一个名为"DOB"的字段,类型为"日期"。如何编写SQL语句来返回出生日期显示为23的所有记录?DOB格式为YYYY-MM-DD。

感谢

如何从SQL语句中返回一个人的生日';s的年龄

WHERE YEAR(GETDATE() - DATEPART(dy, DOB) + 1) - YEAR(DOB) = 37

只需将37更改为23即可,或者最好使用可变

下面是一个可以运行的例子

CREATE TABLE #test(DOB DATETIME)
INSERT #test VALUES('19701127')
INSERT #test VALUES('19741127')
INSERT #test VALUES('19740227')
INSERT #test VALUES('19761127')
INSERT #test VALUES('19761127')
INSERT #test VALUES('19701127')

SELECT * FROM #test
WHERE YEAR(GETDATE() - DATEPART(dy, DOB) + 1) - YEAR(DOB) = 37
1974-11-27 00:00:00.000
1974-02-27 00:00:00.000

您还可以使用这个更复杂的WHERE子句

 SELECT *
        FROM #test
        WHERE DATEDIFF(YEAR, DOB, GETDATE()) -
        CASE WHEN DATEPART(mm,DOB) > DATEPART(mm,GETDATE())
       OR (DATEPART(mm,DOB) = DATEPART(mm,GETDATE())
       AND DATEPART(dd,DOB) > DATEPART(dd,GETDATE()))
        THEN 1 ELSE 0 END = 37

实现这一点的另一种方法。

DECLARE @age int
DECLARE @dob1 date
DECLARE @dob2 date
SELECT @age = 23
SELECT @dob1 = DATEADD(year, -@age, getdate())
SELECT @dob2 = DATEADD(year, 1, @dob1)
SELECT * FROM <table> 
WHERE DOB BETWEEN @dob1 AND @dob2

我假设数据库列和age变量都包含日期/时间数据,而不是字符串。我还将假设[DOB]值保证没有时间分量。

您的规范中缺少一个基准:参考日期。换句话说,考虑到23岁和一堆生日,你想知道哪些人在某个日期是23岁。您可能会认为这是当前日期,但在这里我们将把它概括为一个变量。

1989年2月24日出生的人今天23岁;任何晚生的人都更年轻。1988年2月24日或更早出生的人今天已经24岁或以上了。因此,期望的范围是1988年2月25日至1989年2月24日。

DECLARE @age int
DECLARE @referenceDate date
DECLARE @rangeEnd date
DECLARE @rangeBegin date
SELECT @age = 23
SELECT @referenceDate = GETDATE()
            --2012-02-24
SELECT @rangeBegin = DATEADD(day, 1, DATEADD(year, -@age-1, @referenceDate))
            --1988-02-25
SELECT @rangeEnd = DATEADD(year, -@age, @referenceDate)
            --1989-02-24
-- EDIT: this expression is incorrect; thanks to ypercube for catching the bug
-- SELECT @rangeBegin = DATEADD(day, 1, DATEADD(year, -1, @rangeEnd))
SELECT * FROM <table> 
WHERE DOB BETWEEN @rangeBegin AND @rangeEnd

那些出生日期与今天相同,正好是@age年前的人:

WHERE dob = DATEADD( year, - @age, GETDATE() ) 

如果DOB字段是日期字段,则可以进行一些日期比较以获得所需内容。

SELECT user, DOB FROM yourtable 
WHERE MONTH(CURDATE())=MONTH(DOB) AND 
DAY(CURDATE())=DAY(DOB) AND YEAR(CURDATE())-YEAR(DOB)=23;