AVG两个日期,发出NULL值

时间:2018-04-30 16:06:40

标签: oracle

我是使用Oracle SQL Developer编写Oracle SQL的新手,已经从MS SQL Server环境进行了更改。尝试计算两个日期之间的平均值,截断,并获取其中一个日期(appt.CONTACT_DATE)为NULL的值。我希望那里有空。请参阅下面的代码。我做错了什么?非常感谢帮助。

TRUNC (
          AVG (
               TO_DATE (appt.CONTACT_DATE, 'DD-MM-YYYY')
             - TO_DATE (REF.ENTRY_DATE, 'DD-MM-YYYY'))
          OVER (PARTITION BY ser2.PROV_NAME),
          1)
          AS "AVG BY PROVIDER"

1 个答案:

答案 0 :(得分:2)

那将是

TRUNC (AVG (appt.contact_date - REF.entry_date) OVER (PARTITION BY ser2.prov_name), 1)

,因为:

  • 如果CONTACT_DATE和ENTRY_DATE属于DATE数据类型(是的,它们应该是),则您不必(实际上,不得)再次“转换”为日期。
    • 如果它们是字符串(即存储在VARCHAR2列中),那么是 - 您应该通过应用具有适当格式掩码的TO_DATE将它们转换为DATE
  • 两个DATE值之间的差异是天数,因此AVG-ing没有问题
  • truncate也可以

编辑

更多信息:这是一个显示正在发生的事情的例子:

SQL> with
  2  appt (contact_date) as
  3    (select trunc(sysdate) from dual union
  4     select null from dual union all
  5     select null from dual),
  6  ref (entry_date) as
  7    (select trunc(sysdate - 5) from dual),
  8  ser2 (prov_name) as
  9    (select 'a' from dual)
 10  select appt.contact_date, ref.entry_date, ser2.prov_name,
 11    TRUNC (AVG (appt.contact_date - REF.entry_date) OVER (PARTITION BY ser2.prov_name), 1) avg_by_provider
 12  from appt, ref, ser2;

CONTACT_ ENTRY_DA P AVG_BY_PROVIDER
-------- -------- - ---------------
30.04.18 25.04.18 a               5
         25.04.18 a               5
         25.04.18 a               5

SQL>

虽然有两个NULL值,但AVG仍然返回结果,它不是NULL。怎么会?由于ANSI SQL标准,它表示聚合函数(例如AVG)忽略 NULL值。