使用 Oracle SQL Developer v19 的查询中的平均日期列

Posted

技术标签:

【中文标题】使用 Oracle SQL Developer v19 的查询中的平均日期列【英文标题】:Average Date column in a query using Oracle SQL Developer v19 【发布时间】:2021-03-18 02:16:40 【问题描述】:

我有一个查询,结果显示一列年龄,这个年龄是根据“日期”数据类型字段计算的。我想为符合条件的所有记录添加平均年龄。

我一直在搜索谷歌,但没有成功,当我尝试投射时,我得到一个无效的数据类型错误

任何帮助将不胜感激

SELECT P.First_name, P.Last_name, P.Sex, P.Ethnicity, 
Round((sysdate - P.D_O_B) / 365,0) as Age,
CAST( AVG(CAST(CAST(P.D_O_B as DateTime) as Float)) as DateTime)
From Patient P, Tests T
where T.Patient_ID = P.NHS_Number
and T.Result = 'Positive'
and T.date_of_test + 14 > SYSDATE
Group by P.first_name, P.Last_Name, P.Sex, P.Ethnicity, P.D_O_B
Order by Age desc;

这是一个示例,说明我在计算平均年龄时没有失败

【问题讨论】:

转换失败,因为没有要转换的“日期时间”类型。 【参考方案1】:

确实,正如 Gordon Linoff 所指出的,窗口函数函数可能是您所追求的。使用标准连接也是必须的。

不过,我也建议修复日期算术;并非所有年份都有 365 天,因此您的查询在闰年是关闭的 - 当一个人变老时,不准确性会增加。相反,我会推荐months_between()

select p.first_name, p.last_name, p.sex, p.ethnicity, 
    round(months_between(sysdate, p.d_o_b) / 12, 0) as age,
    round(avg(months_between(sysdate, p.d_o_b) / 12) over(), 0) as avg_age
from patient p 
inner join tests t on t.patient_id = p.nhs_number
where t.result = 'positive' and t.date_of_test + 14 > sysdate
group by p.first_name, p.last_name, p.sex, p.ethnicity, p.d_o_b
order by age desc;

【讨论】:

【参考方案2】:

你似乎想要一个窗口函数:

select P.First_name, P.Last_name, P.Sex, P.Ethnicity, 
       Round((sysdate - P.D_O_B) / 365,0) as Age,
       round(avg((sysdate - P.D_O_B) / 365, 0) over (), 0) as avg_age
From Patient P join
     Tests T
     on T.Patient_ID = P.NHS_Number
where T.Result = 'Positive' and
      T.date_of_test + 14 > SYSDATE
Group by P.first_name, P.Last_Name, P.Sex, P.Ethnicity, P.D_O_B
Order by Age desc;

请注意,我还修复了您的古老连接语法。

【讨论】:

以上是关于使用 Oracle SQL Developer v19 的查询中的平均日期列的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql developer工具 如何给用户分配权限

oracle查询未释放连接的sql

oracle sql developer的安装过程和使用说明

我用PL/SQL-Developer登录oracle时出现 ORA-12560:TNS:协议适配器错误怎么办?急!!!!!

如何安装pl/sql developer

Oracle--SQL Developer创建连接及使用