PL/SQL:求两个值相减的平均值

Posted

技术标签:

【中文标题】PL/SQL:求两个值相减的平均值【英文标题】:PL/SQL: Finding the average of a substraction of two values 【发布时间】:2019-10-14 19:16:14 【问题描述】:

本质上,我的部分功能是找到名为 Days_Stayed 的局部变量的平均值,它是 Departure_Date 和 Arrival_Date 的减法。 REGISTRATION 表只存储人到达和离开的日期,而不是停留时间本身。

我的问题是当客户停留超过一次时会发生这种情况,因此有多个 Departure_Dates 和 Arrival_Dates。如果有意义的话,平均值由每个减法的结果的总和组成。

 CREATE OR REPLACE FUNCTION
    (p_CustomerCode CHAR)
    RETURN VARCHAR2
    IS 
    v_Output VARCHAR2(100);
    Days_Stayed DATE;
BEGIN
        --SELECT STATEMENT FROM REGISTRATION TABLE--
        IF Registration_Status = 'R' THEN
            Days_Stayed = Departure_Date - Arrival_Date;
            v_Output := (SELECT TO_CHAR(AVG(Days_Stayed), 'Day') 
                         FROM REGISTRATION WHERE Customer_Code = p_CustomerCode), 
                         --other columns

如果有人能帮我解决这个问题,将不胜感激!

【问题讨论】:

【参考方案1】:

听起来应该是:

v_Output := (SELECT TO_CHAR(AVG(Departure_Date - Arrival_Date), 'Day') 
                         FROM REGISTRATION WHERE Customer_Code = p_CustomerCode)

只需将减法放在 select 语句中。 这行得通吗?

【讨论】:

我会去看看,但是如果有多个出发和到达记录,会不会吓坏了? (假设客户多次入住) 没有平均函数会对列求和,然后除以行数。这是一个例子:java2s.com/Tutorials/Database/Oracle_Aggregate_Function/…【参考方案2】:

对我来说,这听起来像 SUM / COUNT,例如

SQL> with registration (id, departure_date, arrival_date) as
  2    (select 1, date '2019-09-20', date '2019-09-17' from dual union all -- 3 days
  3     select 1, date '2019-08-13', date '2019-08-11' from dual union all -- 2 days
  4     select 1, date '2019-08-08', date '2019-08-01' from dual union all -- 7 days
  5     --
  6     select 2, date '2019-07-20', date '2019-07-19' from dual union all -- 1 day
  7     --
  8     select 3, date '2019-08-27', date '2019-08-25' from dual union all -- 2 days
  9     select 3, date '2019-08-14', date '2019-08-12' from dual           -- 2 days
 10    )
 11  select id,
 12         sum(departure_date - arrival_date) / count(*) avg_days_stayed
 13  from registration
 14  group by id;

        ID AVG_DAYS_STAYED
---------- ---------------
         1               4
         2               1
         3               2

SQL>

为什么?您的代码减去出发和到达日期(单个值),那么 - 您将如何选择一个值的平均值?也许您打算使用循环(通过每个人)或其他方式,但是 - 上述查询可能会将您推向正确的方向,即没有循环,使用单个查询。

【讨论】:

以上是关于PL/SQL:求两个值相减的平均值的主要内容,如果未能解决你的问题,请参考以下文章

js日期相减求天数 精确到秒

oracle把查两个日期相减的天数变成数字类型

SQL Case 语句中的两个值相减

在SQLserver中如何获得两个日期相减的天数

C#实现两个时间相减的方法

java 两个日期相减的怎么做?