使用 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 developer的安装过程和使用说明
我用PL/SQL-Developer登录oracle时出现 ORA-12560:TNS:协议适配器错误怎么办?急!!!!!