【问题标题】:Fine tune EXTRACT HOUR and DAY微调 EXTRACT HOUR 和 DAY
【发布时间】:2021-07-01 07:31:51
【问题描述】:

我有一个根据以下查询的逻辑来从时间戳中提取天数并以小时为单位。

  CASE WHEN LATEST_TIMESTAMP IS NULL

 THEN 
      EXTRACT (HOUR FROM (SYSDATE - CREATION_TIMESTAMP)) + EXTRACT (DAY FROM (SYSDATE - 
      CREATION_TIMESTAMP)) * 24
 ELSE
     EXTRACT (HOUR FROM (LATEST_TIMESTAMP - CREATION_TIMESTAMP)) + EXTRACT (DAY FROM 
    (LATEST_TIMESTAMP - CREATION_TIMESTAMP)) * 24

 END

AS TIME_IN_HOURS

处理多条记录时效率低下,无论如何是否可以微调查询?

【问题讨论】:

  • 在这种情况下“效率低下”是什么意思?
  • 查询需要很长时间来处理大量记录

标签: oracle extract days hour


【解决方案1】:

两个DATE 数据类型值的差异是它们之间的天数。因此,如果您“缩短”您的代码以使用 NVL(对于 latest_timestampNULL 的情况)并简单地将结果乘以 24(以获得小时数),您会得到

select (nvl(latest_timestamp, sysdate) - creation_timestamp)) * 24 as time_in_hours
from some_table

这个结果可能应该是四舍五入的(但这很容易)。

看看有没有帮助。

【讨论】:

  • 执行时间是完美的,但结果四舍五入到我得到的值“+7054 03:34:39.480000”这样不可读。查询可以同时处理 latest_timestamp 为 NULL 和 NOT NULL 吗?
  • NVL 处理它;如果 LATEST_TIMESTAMP 不为空,它将取其值。否则,它将花费 SYSDATE。
【解决方案2】:

NVL 和 Extract 的组合解决方案

select  EXTRACT (DAY FROM(nvl(latest_timestamp, sysdate) - creation_timestamp)) * 24) as time_in_hours from some_table

【讨论】:

    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2022-06-24
    相关资源
    最近更新 更多