Oracle SQL - 使用SYSDATE显示

时间:2011-05-05 20:32:03

标签: sql oracle

这是表格:

Col1    Col2    Col3
---------------------------------------
4567    102     5/5/2011 3:37:41 PM
9876    102     5/5/2011 3:37:43 PM
1234    104     5/5/2011 12:46:16 PM
9999    104     5/5/2011 12:47:09 PM
9999    104     5/5/2011 12:47:15 PM

如何通过秒'SS'和/或分钟'MI'在报告上快速显示,使用SYSDATE仅获取一个或多个记录?我知道BETWEEN fxn,但处理秒数,这对我来说是一种滑坡。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

不太清楚你的意思,但如果你想将返回的记录限制在几分钟或几秒钟之内,并假设COL3被编入索引,你可以这样做:

SELECT COL1, COL2, COL3
FROM MY_TABLE
WHERE COL3 > SYSDATE - INTERVAL '3' MINUTE
ORDER BY COL3 DESC;
如果您愿意,

INTERVAL可以在几秒钟内完成;或两者,例如INTERVAL '01:30' MINUTE TO SECOND将返回90秒,INTERVAL '90' SECOND也是如此。 (也不确定用户是否需要将其作为参数提供)。


仍然不清楚您要实现的目标以及要用于限制返回行的标准。但如果您确实想要最新的记录以及任何属于特定时期的记录,您可以这样做:

SELECT COL1, COL2, COL3 FROM (
    SELECT COL1, COL2, COL3,
        NUMTODSINTERVAL(
            FIRST_VALUE(COL3) OVER (ORDER BY COL3 DESC) - COL3,'DAY') AS DIFF
    FROM MY_TABLE
)
WHERE DIFF < INTERVAL '01:30' MINUTE TO SECOND
ORDER BY COL3 DESC;

这会在90秒内返回最近的记录,加上COL3的任何记录。所以总会有至少一条记录返回。但它不是过滤COL3,它必须评估每一行来计算偏移量,因此它可能会进行全表或索引扫描。例如,如果你只想要今天的记录,你或许可以过滤内在的选择。如果不是,它可能不符合您的“快速”要求。

可能更快,但也许更丑陋的解决方案可能是:

SELECT COL1, COL2, COL3
FROM MY_TABLE
WHERE COL3 > (SELECT MAX(COL3) FROM MY_TABLE) - INTERVAL '01:30' MINUTE TO SECOND
ORDER BY COL3 DESC;

真的不确定这是你想要的,或SYSDATE如何适应。

答案 1 :(得分:1)

您可以使用SYSDATE进行计算。减1是昨天。减去1/24是一小时前。减1 /(24 * 60)是一分钟前。减去1 /(24 * 60 * 60)就是一秒钟前。

此查询应显示最近10秒内所有日期的记录:

select *
from my_table
where col3 > sysdate - 10/(24*60*60);

这就是你要追求的吗?