需要帮助基于时间戳从oracle DB中获取行

时间:2018-07-14 03:02:09

标签: sql database oracle

我正在尝试为以下情况编写sql查询。如果能得到任何帮助,那就太好了。

场景:

我有一个表(emp),该表具有三列id,time和value。表中没有主键。时间是保存日期和时间戳的日期列。

表将从下午开始开始更新。因此,表格从早上到下午都会有昨天的数据。在插入当前数据之前,将清除昨天的所有行,并从中午到晚上开始动态更新表。但是我需要从早上开始运行查询,而我的查询不应获取昨天的数据。因此,理想情况下,从早上到下午,我应该等待数据出现,并且不应该获取任何行,而应在将当前日期数据插入其中后开始获取数据。

我需要每五分钟运行一次查询,当我运行查询时,我应该获取表中的所有最新行,以便每当表中有更新时,这些行就会被提取。

例如,当表格从下午1点开始更新时。当我开始第一个查询时,我应该获得所有行;五分钟后,当我再次以1.05运行相同的查询时,我应该获得在1PM和1.05PM之间插入的所有行。

我的想法:

从emp中选择max(time);

在一天的开始,我应该检查表中的最长时间,它肯定是昨天的日期,因此我将在本地变量中设置今天的日期(2018-07-14 00:00:00),或者今天的日期,那么该值将存储在本地变量中。

我也可以通过将它与sysdate进行比较(如下面的查询),在上述查询中执行相同的操作,但是不确定性能,因为我发现与我猜测的所有行进行比较都花了一些时间。请参阅下面的上述修改后的查询

从emp中选择max(time),其中time = sysdate;

从表中获取最大时间后,将为其指定一个变量lastquerytime,然后查询行数大于此时间戳的表,以便每五分钟获取一次所有最新行。

从emp中选择id,time,value,其中time> lastquerytime;

因此,想法是获取所有行并检查其中的最大时间戳,并在下一次查询表时使用时间戳大于此最大时间戳的行。这样,直到一天结束时,每五分钟都要做一次。

现在,我正在使用两个查询来实现此方案。 任何针对这种情况的更好方法的建议和查询将对我有很大帮助。

2 个答案:

答案 0 :(得分:0)

您应该使用类似的方法来获取昨天的数据:

SELECT id,time,value FROM emp WHERE time BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE) - 1/86400

答案 1 :(得分:0)

如果我的理解正确,您希望表的最大日期上的所有行。

如果是这样:

select e.*
from emp
where time >= (select trunc(max(time)) from emp);

如果您想要基于时钟时间的结果,则可以使用trunc(sysdate)