4

选择在某个日期范围内(开始日期和结束日期)年满 17 岁的用户--

感谢大家!

用户

  • ID
  • 出生日期

例子:

  1. User_1 生日09/28/1996

  2. User_2 生日08/25/1996

  3. User_3 生日07/28/1995

  4. User_4 生日05/25/1995

如果日期范围是FROM 03/05/2013 To End Date 6/05/2013 *User_1 和 User_2 出现是因为他们在该时间段内符合 17 岁的标准*

然而

如果范围从 02/10/2012结束日期 06/05/2013 所有用户都应该出现,因为他们在日期范围内的某个时间点都是 17 岁

我曾尝试使用 Datepart() 但我无法清楚地思考它以得出我想要的答案

Select u.id, u.birthdate
From Users u
where convert(varchar,DATEPART(MM,u.birthdate))<=DATEPART(MM,'03/05/2013')

在大家的帮助下,我得出了一个结论

DATEADD(YY,17,birthdate) between @from and @end
4

3 回答 3

4

这些应该这样做;

SELECT * FROM users 
WHERE birthdate BETWEEN DATEADD(year, -18, '2013-03-05')   -- lo date of range
                    AND DATEADD(year, -17, '2013-06-05');  -- hi date of range

SELECT * FROM users 
WHERE birthdate BETWEEN DATEADD(year, -18, '2012-02-10')   -- lo date of range
                    AND DATEADD(year, -17, '2013-06-05');  -- hi date of range

一个用于测试的 SQLfiddle

请注意,User_1 于 2013 年 9 月 28 日年满 17 岁,而 User_2 于 2013 年 8 月 25 日年满 17 岁,因此它们都不(或不应该)包含在任一范围内。

于 2013-06-05T19:35:29.817 回答
2

我的首选方法:

使用日期数据类型和日期之间的显式比较。我建议在 SQL Server 2008+ 中将出生日期存储为日期数据类型,并为日期时间文字使用ISO 8601格式以避免歧义。

select id, birthdate
from Users
where birthdate > dateadd(year, -18, '2013-03-05') -- Check lower bounds
    and birthdate <= dateadd(year, -17, '2013-06-05'); -- Check upper bounds

请注意,我已将该dateadd函数移至此版本的常量。正如其他人敏锐地观察到的那样,这意味着更少的计算(除非您只有 1 行?),并且 - 也许更重要的是 - 允许使用生日索引。

BETWEEN方法:

如另一个答案所示, usingBETWEEN可以产生类似的结果:

select id, birthdate
from users 
where birthdate between dateadd(year, -18, '2013-03-05')
        and dateadd(year, -17, '2013-06-05')

但是,BETWEEN是包容性的,这意味着它将匹配包括端点在内的所有范围。在这种情况下,我们将在任何用户的 18 岁生日时得到匹配,这很可能不是预期的结果(17 岁和 18 岁之间通常存在重要差异)。我想您可以使用额外DATEADD的来减去一天,但我喜欢在使用BETWEENAaron Bertrand 建议时保持一致。

不该做什么:

不要使用DATEPARTorDATEDIFF进行这种类型的比较。它们不代表时间跨度。 DATEDIFF显示了跨越边界的差异。看看以下仅仅一天的年龄如何表明某人已经一岁了,因为这些年在技术上是分开的:

select datediff(year, '2012-12-31', '2013-01-01'); -- Returns 1!

以这种方式使用 'DATEPART' 多年的计算会产生相同的结果(类似于月/12 等,一直到毫秒)。

感谢所有注意到索引可能性的人。让我们不要忘记“让它工作,让它正确,让它快速”的顺序。

于 2013-06-05T19:43:16.437 回答
-1

尝试

SELECT * 
FROM
Users
WHERE
        DATEDIFF(year,@DATE1, '02/10/2012') = 17
OR
    DATEDIFF(year,@DATE2, '06/05/2013') =17

将上面的@DATE1 和@DATE2 替换为所需的日期。

于 2013-06-05T18:41:11.520 回答