如何从SQL语句中返回一个人的生日';s的年龄
本文关键字:生日 一个人的 SQL 语句 返回 | 更新日期: 2023-09-27 18:25:48
我正试图在ASP.net中创建一个过滤器,用户可以在其中选择某个年龄,SQL语句将根据"DOB"(出生日期)字段返回当前处于该年龄的所有用户。
例如,假设我有一个变量age
,它当前包含23。我在数据库中有一个名为"DOB"的字段,类型为"日期"。如何编写SQL语句来返回出生日期显示为23的所有记录?DOB格式为YYYY-MM-DD。
感谢
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;