【问题标题】:Oracle GROUP BY and date precisionOracle GROUP BY 和日期精度
【发布时间】:2016-03-13 12:10:14
【问题描述】:

我有一个包含两个日期字段的表格:BEGIN_DATEEND_DATE

当我减去这两个字段时,我得到一个以天为单位的数字。
我想要这个数字以秒为单位,因为这两个字段之间的差异非常小(~ 1s)。
所以我继续这样做:

SELECT ROUND(AVG((END_DATE-BEGIN_DATE)*3600*24),2) AS DELTA,
       TO_CHAR(BEGIN_DATE, 'yyyy-mm-dd hh24:mi:ss') AS DEB, 
       TO_CHAR(END_DATE, 'yyyy-mm-dd hh24:mi:ss') AS FIN
FROM MYTABLE
GROUP BY TO_CHAR(BEGIN_DATE, 'yyyy-mm-dd hh24:mi:ss'), 
         TO_CHAR(END_DATE, 'yyyy-mm-dd hh24:mi:ss');

这是结果(与 group by minutes 的精度相同):


好吧。
然后,如果我按小时按天对结果进行分组:

SELECT ROUND(AVG((END_DATE-BEGIN_DATE)*3600*24),2) AS DELTA,
       TO_CHAR(BEGIN_DATE, 'yyyy-mm-dd hh24') AS DEB, 
       TO_CHAR(END_DATE, 'yyyy-mm-dd hh24') AS FIN
FROM MYTABLE
GROUP BY TO_CHAR(BEGIN_DATE, 'yyyy-mm-dd hh24'), 
         TO_CHAR(END_DATE, 'yyyy-mm-dd hh24');

我得到了这个结果:

DELTA 精度更好,我不明白为什么!
谁能解释一下?

【问题讨论】:

  • 因为 0 和 1 的平均值是 0.5?
  • 如果您从 SELECT 中删除列 Deb 和 Fin,该行为是否会继续?还有你的 nls_date_format 参数的默认值是多少?

标签: sql oracle date group-by


【解决方案1】:

我的不好,不要再进一步了,问题比较简单。

浮动结果由以下公式给出:SUM(DELTA) / COUNT(Grouped rows)。

如果我在 2015-11-02 19 有 20 个值。
这些值中有 9 个等于 1,余数等于 0。
我们有 9/20 = 0.45,这绝对是合乎逻辑的。 我刚刚验证过了。

感谢您的宝贵时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多