【问题标题】:How to calculate age from date of birth and group each member into age range in sql如何从出生日期计算年龄并将每个成员分组到sql中的年龄范围
【发布时间】:2014-05-16 18:45:07
【问题描述】:

我有一个 sql 表,用于存储人们的详细信息,即 id、姓名、DoB、registration_date 和地址。我想计算每个人的年龄,然后将他们分成以下范围:20-30、31-50、51 岁及以上。

我知道我可以通过以下方式获取年龄:(https://stackoverflow.com/a/1572257/3045800)

SELECT FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age

我只需要弄清楚如何将所有人分组到各自的范围内。

感谢您的帮助

【问题讨论】:

  • 1) MySQL 还是 SQL SERVER? 2)你真的是要对这些人进行分组(例如计算他们)吗​​?还是您只想添加一列说明他们所在的组?
  • 您应该信任一个可以将日期转换为整数的 dbms 吗?
  • @JakubKania 我正在使用 MySQL,但我只是想了解它背后的想法,而不是真正的语法。而且,是的,我想对它们进行计数,然后显然将它们显示在不同的分组中。谢谢

标签: mysql sql sql-server


【解决方案1】:

使用case 生成年龄段描述:

select *,
  case
    when datediff(now(), date_of_birth) / 365.25 > 50 then '51 & over'
    when datediff(now(), date_of_birth) / 365.25 > 30 then '31 - 50'
    when datediff(now(), date_of_birth) / 365.25 > 19 then '20 - 30'
    else 'under 20'
  end as age_group
from person

注意计算年龄的更简单方法。

【讨论】:

  • 太棒了!请注意,如果该值为 null,它将属于 else 子句。添加WHEN date_of_birth IS NULL then 'NULL' 使其更具体。
【解决方案2】:

您可以使用 with 构造:

with Query as (
   select FLOOR((CAST (GetDate() AS INTEGER) - CAST(Date_of_birth AS INTEGER)) / 365.25) AS Age
          ... -- Other fields
     from MyTable
   )

   select case 
            -- whatever ranges you want
            when (Age < 20) then
              1
            when (Age >= 20) and (Age <= 30) then
              2
            when (Age > 30) and (Age <= 50) then
              3
            else
              4  
          end AgeRange,
          ...  
     from Query
 group by AgeRange

【讨论】:

  • 这个问题有点令人困惑,但它确实特别提到了年龄范围
  • 如果需要范围(不仅仅是年龄),可以使用适当的大小写(参见我的编辑)
  • 我知道可以使用什么,我只是想让你知道你应该仔细阅读:)
  • 我确实是指年龄范围,但显然是想先了解年龄,然后才能知道它适合什么范围。我对你的答案投了赞成票,但我认为上面 Bohemain 的答案更直观。
【解决方案3】:

我曾经遇到过同样的要求,这就是我解决它的方法:我希望有一个直截了当的方式,因为这不是:

  SELECT  (CASE
              WHEN G.DATE_OF_BIRTH IS NULL
              THEN
                 '18-24' --Put your default Range In case the date of birth is null
              ELSE
                 CASE
                    WHEN   EXTRACT (
                              YEAR FROM (select sysdate from dual))
                         - EXTRACT (YEAR FROM g.DATE_OF_BIRTH) < 18
                    THEN
                       'MINORS'
                    ELSE
                       CASE
                          WHEN   EXTRACT (
                                    YEAR FROM (select sysdate from dual))
                               - EXTRACT (YEAR FROM g.DATE_OF_BIRTH) BETWEEN 25
                                                                         AND 29
                          THEN
                             '25-29'
                          ELSE
                             CASE
                                WHEN   EXTRACT (
                                          YEAR FROM (select sysdate from dual))
                                     - EXTRACT (YEAR FROM g.DATE_OF_BIRTH) BETWEEN 30
                                                                               AND 34
                                THEN
                                   '30-34'
                                ELSE
                                   CASE
                                      WHEN   EXTRACT (
                                                YEAR FROM (select sysdate from dual))
                                           - EXTRACT (
                                                YEAR FROM g.DATE_OF_BIRTH) BETWEEN 35
                                                                               AND 39
                                      THEN
                                         '35-39'
                                      ELSE
                                         CASE
                                            WHEN   EXTRACT (
                                                      YEAR FROM (select sysdate from dual))
                                                 - EXTRACT (
                                                      YEAR FROM g.DATE_OF_BIRTH) BETWEEN 40
                                                                                     AND 49
                                            THEN
                                               '40-49'
                                            ELSE
                                               CASE
                                                  WHEN   EXTRACT (
                                                            YEAR FROM (select sysdate from dual))
                                                       - EXTRACT (
                                                            YEAR FROM g.DATE_OF_BIRTH) BETWEEN 50
                                                                                           AND 59
                                                  THEN
                                                     '50-59'
                                                  ELSE
                                                     CASE
                                                        WHEN   EXTRACT (
                                                                  YEAR FROM (select sysdate from dual))
                                                             - EXTRACT (
                                                                  YEAR FROM g.DATE_OF_BIRTH) BETWEEN 60
                                                                                                 AND 69
                                                        THEN
                                                           '60-69'
                                                        ELSE
                                                           CASE
                                                              WHEN   EXTRACT (
                                                                        YEAR FROM (select sysdate from dual))
                                                                   - EXTRACT (
                                                                        YEAR FROM g.DATE_OF_BIRTH) >=
                                                                      70
                                                              THEN
                                                                 'ELDERLY'
                                                           END
                                                     END
                                               END
                                         END
                                   END
                             END
                       END
                 END
           END) from your table g

这只是一个例子。用您的首选范围替换范围。这是我使用 Oracle 完成的。

【讨论】:

  • 虽然我认为这会很好,但我认为它有点长,并且有一种更短的方法来解决查询。看看下面波西米亚的解决方案..
  • 我说过 :) 这不是很直接,但可以达到目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2013-10-31
  • 1970-01-01
相关资源
最近更新 更多