SQL Server-获取所选年份中所有年满25岁的人员

SQL Server-获取所选年份中所有年满25岁的人员,sql,sql-server,Sql,Sql Server,我有一个包含3个字段的表: 全名(Nvarchar(100)) 账户(Nvarchar(50)) 生日(日期时间) 我需要的是创建一个查询,从中获取所选年份中所有过25岁生日的人 例如,了解所有在2003年过25岁生日的人 现在我有这个: DECLARE @dynamicdate DATETIME SET @dynamicdate = CONVERT(datetime, '20131231') SELECT * FROM persons p WHERE (year(@dynamicdate

我有一个包含3个字段的表:

  • 全名(Nvarchar(100))
  • 账户(Nvarchar(50))
  • 生日(日期时间)
我需要的是创建一个查询,从中获取所选年份中所有过25岁生日的人

例如,了解所有在2003年过25岁生日的人

现在我有这个:

DECLARE @dynamicdate DATETIME
SET @dynamicdate = CONVERT(datetime, '20131231')

SELECT *
FROM persons p
WHERE
(year(@dynamicdate-p.birthdate)-1900)=25

但我知道这是完全错误的,应该非常简单,有什么线索吗?

尽量避免对
WHERE
子句中使用的列执行计算或函数。相反,请更改表达式,使列本身位于条件表达式的一侧,如下所示:

DECLARE @BirthYear int = 2003 - 25;

SELECT *
FROM dbo.Persons P
WHERE
   P.BirthDate >= DateAdd(year, @BirthYear - 2000, '20000101')
   AND P.BirthDate < DateAdd(year, @BirthYear - 2000, '20010101')
;
DECLARE@BirthYear int=2003-25;
挑选*
来自dbo.P
哪里
P.BirthDate>=DateAdd(年份,@birthdear-2000,'20000101')
和P.生日<日期添加(年份,@BirthYear-2000,'20010101')
;

请特别注意我使用的不等式运算符,
=
尽量避免对
WHERE
子句中使用的列执行计算或函数。相反,请更改表达式,使列本身位于条件表达式的一侧,如下所示:

DECLARE @BirthYear int = 2003 - 25;

SELECT *
FROM dbo.Persons P
WHERE
   P.BirthDate >= DateAdd(year, @BirthYear - 2000, '20000101')
   AND P.BirthDate < DateAdd(year, @BirthYear - 2000, '20010101')
;
DECLARE@BirthYear int=2003-25;
挑选*
来自dbo.P
哪里
P.BirthDate>=DateAdd(年份,@birthdear-2000,'20000101')
和P.生日<日期添加(年份,@BirthYear-2000,'20010101')
;

请特别注意我使用的不等式运算符,
=
尽量避免对
WHERE
子句中使用的列执行计算或函数。相反,请更改表达式,使列本身位于条件表达式的一侧,如下所示:

DECLARE @BirthYear int = 2003 - 25;

SELECT *
FROM dbo.Persons P
WHERE
   P.BirthDate >= DateAdd(year, @BirthYear - 2000, '20000101')
   AND P.BirthDate < DateAdd(year, @BirthYear - 2000, '20010101')
;
DECLARE@BirthYear int=2003-25;
挑选*
来自dbo.P
哪里
P.BirthDate>=DateAdd(年份,@birthdear-2000,'20000101')
和P.生日<日期添加(年份,@BirthYear-2000,'20010101')
;

请特别注意我使用的不等式运算符,
=
尽量避免对
WHERE
子句中使用的列执行计算或函数。相反,请更改表达式,使列本身位于条件表达式的一侧,如下所示:

DECLARE @BirthYear int = 2003 - 25;

SELECT *
FROM dbo.Persons P
WHERE
   P.BirthDate >= DateAdd(year, @BirthYear - 2000, '20000101')
   AND P.BirthDate < DateAdd(year, @BirthYear - 2000, '20010101')
;
DECLARE@BirthYear int=2003-25;
挑选*
来自dbo.P
哪里
P.BirthDate>=DateAdd(年份,@birthdear-2000,'20000101')
和P.生日<日期添加(年份,@BirthYear-2000,'20010101')
;

请特别注意我使用的不等式运算符,
=
您应该能够简单地查询所讨论日期的年份部分,因为您只想知道这些人的25岁生日是否属于这一年

DECLARE @Year AS INT

SET @Year = 2003

SELECT *
FROM Persons P
WHERE ((@Year - DATEPART(yy, birthdate)) = 25)
这把小提琴演示了


请记住,这不是优化的,但在您实际测量性能并确定此特定查询是一个问题之前,我不会进行优化。首先,我将重点介绍最简单、最容易阅读的解决方案。

您应该能够简单地查询所讨论日期的年份部分,因为您只想知道这些人的25岁生日是否属于这一年

DECLARE @Year AS INT

SET @Year = 2003

SELECT *
FROM Persons P
WHERE ((@Year - DATEPART(yy, birthdate)) = 25)
这把小提琴演示了


请记住,这不是优化的,但在您实际测量性能并确定此特定查询是一个问题之前,我不会进行优化。首先,我将重点介绍最简单、最容易阅读的解决方案。

您应该能够简单地查询所讨论日期的年份部分,因为您只想知道这些人的25岁生日是否属于这一年

DECLARE @Year AS INT

SET @Year = 2003

SELECT *
FROM Persons P
WHERE ((@Year - DATEPART(yy, birthdate)) = 25)
这把小提琴演示了


请记住,这不是优化的,但在您实际测量性能并确定此特定查询是一个问题之前,我不会进行优化。首先,我将重点介绍最简单、最容易阅读的解决方案。

您应该能够简单地查询所讨论日期的年份部分,因为您只想知道这些人的25岁生日是否属于这一年

DECLARE @Year AS INT

SET @Year = 2003

SELECT *
FROM Persons P
WHERE ((@Year - DATEPART(yy, birthdate)) = 25)
这把小提琴演示了


请记住,这不是优化的,但在您实际测量性能并确定此特定查询是一个问题之前,我不会进行优化。首先,我将重点介绍最简单、最容易阅读的解决方案。

您可以使用datepart传递值(也可以传递日期)
选择*from Person,其中(datepart(year,'2007-12-31')-datepart(year,birthdate))=25

您可以使用datepart传递值(也可以传递日期)
选择*from Person,其中(datepart(year,'2007-12-31')-datepart(year,birthdate))=25

您可以使用datepart传递值(也可以传递日期)
选择*from Person,其中(datepart(year,'2007-12-31')-datepart(year,birthdate))=25

您可以使用datepart传递值(也可以传递日期)
选择*from Person,其中(datepart(year,'2007-12-31')-datepart(year,birthdate))=25

假设所有生日都是日期(没有时间部分),应该是这样的。那么您只需要使用where子句:

where birthdate between 
     dateadd(year, @year-1925, 0) And
     dateAdd(day, -1, dateadd(year, @year-1924, 0))

假设所有的生日都是日期(没有时间部分),应该是这样的。那么您只需要使用where子句:

where birthdate between 
     dateadd(year, @year-1925, 0) And
     dateAdd(day, -1, dateadd(year, @year-1924, 0))

假设所有的生日都是日期(没有时间部分),应该是这样的。那么您只需要使用where子句:

where birthdate between 
     dateadd(year, @year-1925, 0) And
     dateAdd(day, -1, dateadd(year, @year-1924, 0))

假设所有的生日都是日期(没有时间部分),应该是这样的。那么您只需要使用where子句:

where birthdate between 
     dateadd(year, @year-1925, 0) And
     dateAdd(day, -1, dateadd(year, @year-1924, 0))

请参阅我的更新,强调在
WHERE
子句中使用正确的不等式运算符的重要性。请参阅我的更新,强调在
WHERE
子句中使用正确的不等式运算符的重要性。请参阅我的更新,强调在
WHERE
请参阅我的更新,强调使用t的重要性