获取最接近变量的日期

时间:2013-02-25 09:05:08

标签: sql oracle oracle11g

我正在研究旋转设备的报告申请。我们每3小时计算一次设备状态,并将计算结果存储在Oracle数据库中。

在报告之前只提供“当前状态”(我们只检索了最新的计算)。但现在用户可以选择及时回滚并查看之前的计算。

SELECT *
FROM G_RunningHoursEvent
WHERE GRTE_TagName='#!VARIABLE_TAGNAME#' AND
      GRTE_ValuesUpdate IN (SELECT MAX(GRTE_ValuesUpdate)
                            FROM G_RunningHoursEvent
                            WHERE GRTE_TagName='#!VARIABLE_TAGNAME#')

SQL不是我最强的诉讼,大多数同事都在度假。我需要一些提示,说明如何提取最接近新变量#!VARIABLE_TIME#

的最新计算

有人有任何建议吗?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,用户将选择日期时间值,您需要选择最接近该时间的事件记录。

以下查询在子查询中做了一些魔术来建立最接近#!VARIABLE_TIME#值的记录。

select 
from g_runninghoursevent
where grte_tagname = '#!VARIABLE_TAGNAME#'
and grte_valuesupdate in 
     ( select grte_valuesupdate 
       from ( with data as 
                   ( select grte_valuesupdate 
                            , abs(grte_valuesupdate  -  #!VARIABLE_TIME#) tdiff
                     from g_runninghoursevent
                     where grte_tagname = '#!VARIABLE_TAGNAME#` )
              select grte_valuesupdate 
                     , rank() over (order by tdiff asc) rnk
              from data )
       where rnk = 1 )

备注

  • ABS()调用表示子查询将返回输入参数之前或之后差异最小的记录。
  • 子查询使用IN而不是相等,因为您可能会获得最小差异的平局
  • 我假设#!VARIABLE_TIME#是日期时间;如果它是一个字符串,你需要将它用适当的掩码投射到一个日期。

答案 1 :(得分:0)

此查询应解决您的问题:

SELECT *
FROM G_RunningHoursEvent
WHERE GRTE_TagName='#!VARIABLE_TAGNAME#' AND
      TRUNC(GRTE_ValuesUpdate) = (SELECT TRUNC(GRTE_ValuesUpdate)
                                  FROM (SELECT GRTE_ValuesUpdate
                                        FROM G_RunningHoursEvent
                                        WHERE GRTE_TagName='#!VARIABLE_TAGNAME#'
                                        ORDER BY GRTE_ValuesUpdate DESC)
                                  WHERE ROWNUM = 1);

执行此操作,您将按日期排序第一行中具有最接近记录(及时)的G_RunningHoursEvent记录。 使用另一个SELECT,您只需提取第一条记录。