【问题标题】:Need help to fetch rows from oracle DB based on timestamp需要帮助以根据时间戳从 oracle DB 中获取行
【发布时间】:2018-12-22 09:52:01
【问题描述】:

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

场景:

我有一个表(emp),它有三列 id、time 和 value。表中没有主键。 time 是一个包含日期和时间戳的日期列。

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

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

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

我的想法:

从 emp 中选择 max(time);

在一天开始时,我应该检查表格中的最大时间,它肯定是昨天的日期,所以我将在局部变量中设置今天的日期(2018-07-14 00:00:00),或者如果它是今天的日期,那么该值将存储在局部变量中。

我也可以在上面的查询中做同样的事情,方法是将它与下面的查询中的 sysdate 进行比较,但我不确定性能,因为我通过与我猜想的所有行进行比较需要时间。请参阅下面修改后的上述查询

select max(time) from emp where time = sysdate;

从表中获取最大时间后,将其设置为一个变量,即lastquerytime,然后查询具有大于此时间戳的行的表,以便我们可以每五分钟获取所有最新的行。

Select id,time,value from emp where time > lastquerytime;

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

现在我使用两个查询来实现这个场景。 为这种情况编写更好的方法和查询的任何建议都会对我有很大帮助。

【问题讨论】:

  • 通过编辑问题提供示例数据和预期输出。
  • 是否应该在午夜之后运行查询以获取昨天最后几分钟的未见数据?还是那些丢失并且永远不会找回的?如果今天的第一次更新在查询看到之前清除了昨天的数据,也会发生这种情况。不确定我是否完全理解您的模型。
  • 问题不清楚。您想定期(每 5 分钟)运行一次查询并获取新数据吗?上次运行后添加的数据?是否始终使用当前时间添加数据(即SYSDATE 用于填充TIME 列)? TIME 列是什么类型? DATETIMESTAMP 还是什么?
  • @Hilarion :是的,定期查询应该每 5 分钟运行一次以获取最新的行。是的,数据将与当前日期和时间一起添加。即使我有日期列,它也会有日期和时间戳值。例如,在下午 1 点,当我运行查询时,它应该获取表中的所有行。当我在 5 分钟后再次查询时,即 01.05 PM,它应该获取在 1.00 PM 和 1.05 PM 之间插入的行。同样,它应该持续到一天结束。希望我试图让你明白。如果没有,请告诉我。

标签: sql database oracle


【解决方案1】:

你应该使用类似的东西来获取昨天的数据:

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

【讨论】:

  • 您的第二个查询不是 Oracle 语法。我不确定这就是问题所在; sysdate 检查是查看最新数据是来自今天还是昨天,而不是查找昨天的所有数据(因为无论如何,这显然会被清除)。
  • @AlexPoole,第二个示例已删除。是的,总的来说这个问题不是很清楚
  • 好吧,我换个说法。。只有删除昨天的所有数据,然后插入今天的数据,下午才会开始更新表格。但是我的查询应该从早上开始运行它不应该检索昨天的数据并开始只检索今天的数据,并且应该在插入今天的数据时发生,即下午..这就是我上面试图解释的内容
  • 所以在上午和下午之间,不会有今天的数据。由于查询应该从早上开始运行,所以直到下午它才会返回任何内容。然后它将返回所有内容。然后什么?整个下午都在添加新数据,还是每天只输入一次数据?查询返回数据后是否仍在运行,还是会“暂停”到第二天早上?还是很不清楚。请记住在提供其他信息时还要编辑原始问题,以便任何人都可以尝试解决该问题,而无需通读所有 cmets。
  • @hilarion:是的,编辑了这个问题。谢谢你的建议。是的,在那之后我们需要从下午开始不断地获取更新的行
【解决方案2】:

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

如果是这样:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多