【问题标题】:Getting age in years in a SQL query在 SQL 查询中获取年龄
【发布时间】:2011-02-23 10:05:15
【问题描述】:

您好,我的任务是对大型 SQL Server 2000 数据库进行一些查询。

我遇到问题的查询是“查找 20 到 40 岁之间的人数”

我该怎么做?我之前查询每个人的数量如下所示:

select count(rid) from people where ... 

(其中 ... 是不相关的条件)。我用谷歌搜索了一些,但我发现用于计算年龄的唯一东西太大了,以至于我看不到如何将其嵌入到查询中,或者它是我无权创建的存储过程。

有人可以帮我解决这个问题吗?

people表的相关部分是这样的:

RID(unique key) | dateofbirth(datetime) | firstname....

【问题讨论】:

  • 你是如何存储生日的?日期时间?
  • @Jon @Ola 修复了它以包含我非常基本的架构。

标签: sql sql-server datetime sql-server-2000


【解决方案1】:

因为您总是将年龄表示为整数...

select cast(DateDiff(d, people.dob, GetDate()) / 365.25 as int) As Age 

【讨论】:

    【解决方案2】:

    假设生日存储为日期时间

    Select Count(*)
    From    (
            Select Id, Floor(DateDiff(d, BirthDate, GetDate()) / 365.25) As Age
            From People
            ) As EmpAges
    Where EmpAges Between 20 And 40
    

    这也可以在没有派生表的情况下写成这样:

    Select Count(*)
    From People
    Where Floor(DateDiff(d, BirthDate, GetDate()) / 365.25)  Between 20 And 40
    

    另一种方法是使用 DateAdd。正如 OMG Ponies 和 ck 所提到的,这将是最有效的,因为它可以在 dateOfBirth 上使用索引(如果存在)。

    Select Count(*)
    From People
    Where DateOfBirth Between DateAdd(yy, -40, GetDate()) And DateAdd(yy, -20, GetDate())
    

    【讨论】:

    • @OMG Ponies - 第一个示例使用派生表 (EmpAges)
    • +1:最后一个是最好的,因为假设存在一个索引,它将利用dateofbirth 列上的索引。而且桌子上只会有一次通过...
    • 底部是唯一好的答案,您应该删除顶部,因为它会慢一千倍。
    • 我最终使用了第二种方法。速度并不重要,因为它是一次运行的查询。
    • @ck, @OMG Ponies,由于 OP 使用了第二种变体,我修改了帖子以说明最后一种是最有效的。
    【解决方案3】:

    您应该计算构成范围边界的日期,然后使用这些日期。

    DECLARE @Today datetime, @StartDate datetime, @EndDate datetime
    
    SET @Today = DateAdd(dd, DateDiff(dd, 0, GetDate()), 0)
    SET @StartDate = DateAdd(dd, 1, DateAdd(yy, -40, @Today))
    SET @EndDate = DateAdd(yy, -20, @Today)
    
    SELECT *
    FROM People
    WHERE DateOfBirth BETWEEN @StartDate AND @EndDate
    

    这为您提供了一个有机会使用索引的查询。

    【讨论】:

    • 这是效果最好的答案。
    【解决方案4】:

    我假设 people 表中包含出生日期。

    粗略的伪代码。

    Select DateDiff(YY, people.DOB. Datetime.NOW) as age
    from people
    where age....
    

    【讨论】:

      【解决方案5】:

      您可以执行以下操作: YEAR(GETDATE()) - YEAR(dateOfBirth) > 20

      【讨论】:

        【解决方案6】:
        select count(*)
        from YourTable
        where dateofbirth >= '1970-05-24' and dateofbirth <= '1990-05-24'
        

        根据当前日期调整日期。

        【讨论】:

        • 哇,这真的让我发笑。这是一个黑客,但会工作
        • 问题是,如果这是需要半定期运行的东西,您将不断更新您的字符串。
        • 当然,这不是最持久的东西(我不会在这里盲目地使用它来替代其他想法:P),但它可以完成工作而无需依赖内置函数和类似。此外,如果您使用编程语言生成查询,您肯定可以从该环境中获取当前日期。尽管这是一个很好的建议,但可以表明事情不必一直都很详细:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2011-02-01
        相关资源
        最近更新 更多