来自单个表的平均出生日期(oracle sql)

Posted

技术标签:

【中文标题】来自单个表的平均出生日期(oracle sql)【英文标题】:Avg date of birth year from single table (oracle sql) 【发布时间】:2017-11-30 22:04:21 【问题描述】:

列日期格式为“01-JAN-2001”的单个表的平均出生日期。希望返回用户总数和平均 DOB YEAR (oracle sql)

模拟表:

|User_ID|birth_date|
|123|01-JAN-2001|
|123|01-JAN-2001|
|123|01-JAN-2001|

【问题讨论】:

平均日期没有多大意义... 需要更好的样本数据,也是预期的结果。 你试过什么?向我们展示您当前的查询尝试。 “平均出生年”是什么意思?你是否只从每个人的 DOB 中提取年份,然后取这些数字的平均值?如果平均值不是整数怎么办 - 你想显示什么? @jarlh - “平均日期”非常有意义(至少在 Oracle date 数据类型中,它是连续的 - 包括一天中的时间)。即,“平均日期”是具有sum(avg_date - individual_date) = 0 属性的唯一日期。它可以通过从所有日期中减去固定日期(如 2000/01/01)、取差值的平均值并将其添加到固定日期来计算。结果与固定日期无关。 【参考方案1】:

假设您的意图只是平均年份,您可以将其解析为日期,提取年份并将其平均为一个数字:

SELECT COUNT(*), AVG(EXTRACT(YEAR FROM TO_DATE(birth_date, 'dd-mon-yyyy'))
FROM   users

【讨论】:

为什么还要麻烦TO_DATE 并提取年份...更好:TO_NUMBER(SUBSTR(birth_date, -4))【参考方案2】:

(Oracle 12c:) 测试表和数据:

create table dt (
  userid_ number generated always as identity ( start with 123 )
, d_ date
);

begin
  for i in 1 .. 15
  loop
    insert into dt ( d_ ) values (
      to_date ( trunc( dbms_random.value( 2446067, 2458100 ) ), 'J' )
    ) ;
   end loop;
end;
/

SQL> select userid_, to_char( d_, 'DD-MON-YYYY' ) dob from dt;

   USERID_ DOB                 
---------- --------------------
       123 19-JUN-2000         
       124 06-OCT-2005         
       125 27-JAN-2012         
       126 09-JUL-2003         
       127 23-JUL-2010         
       128 07-FEB-1992         
       129 20-DEC-2002         
       130 19-MAY-2002         
       131 23-FEB-1990         
       132 26-DEC-1990         
       133 19-JUN-1999         
       134 16-DEC-1994         
       135 13-APR-2017         
       136 31-MAR-2000         
       137 23-MAY-1987

查询和结果:

select 
  count(*) user_count
, trunc( avg( extract( year from d_ ) ) ) avg_dob_year
from dt ;

USER_COUNT AVG_DOB_YEAR
---------- ------------
        15         2000

(不考虑“天”,只考虑“年”)。

使用@mathguy建议的方法时

"... 可以通过减去一个固定的日期来计算,比如 2000/01/01,从所有日期开始,取差值的平均值,以及 将其添加到固定日期。”

...这可能是一个我们可以开始的查询(我相信它可以改进):

select
  count(*) usercount
, to_date( '2000/01/01', 'YYYY/MM/DD' ) fixeddate
, avg( differences ) difftofixed
, to_date('2000/01/01', 'YYYY/MM/DD' ) + avg( differences ) fixedplusdiff
, extract( year from ( to_date('2000/01/01', 'YYYY/MM/DD' ) + avg( differences ) ) ) dob_year
from (
  select 
    d_ - to_date( '2000/01/01', 'YYYY/MM/DD' ) differences
  from dt 
);

-- result
USERCOUNT  FIXEDDATE  DIFFTOFIXED  FIXEDPLUSDIFF  DOB_YEAR  
15         01-JAN-00  250.6        07-SEP-00      2000 

【讨论】:

【参考方案3】:

我不知道您为什么要尝试获取平均日期,但我认为它会是这样的:

“SELECT COUNT(user_id), AVG(EXTRACT(YEAR FROM TO_DATE(birth_date, 'dd-MM-yyyy'))
FROM users”

【讨论】:

以上是关于来自单个表的平均出生日期(oracle sql)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL 计算年龄

Oracle SQL - 来自/来自带有日期的表的日期

SQL计算年龄

SQL 中怎么根据出生日期算出年龄 然后用年龄查询

怎样在excel中算平均年龄

Oracle PL/SQL,如何使用简单的替换变量和months_between计算出生日期的年龄