【问题标题】:Query to fetch records only form previous half hour with time stamp in unix epoch format查询仅从前半小时获取记录,时间戳为 unix 纪元格式
【发布时间】:2017-12-14 23:28:36
【问题描述】:

我希望 SQL 查询 fetch/select 记录,这些记录仅取自前半小时。例如,如果我的调度程序在下午 2 点运行,然后在 2:30 再次运行,则在 2:30 运行期间,它应该只从下午 2 点到 2:30 之间而不是更早的时间选择行,使用存储时间的列 created_timestamp作为 unix 纪元格式,例如:

|created_timestamp|
|1497355750350    |
|1497506182344    |

【问题讨论】:

  • created_timestamp 列是数字格式
  • 我很确定您的问题与this 重复。

标签: sql oracle epoch date-arithmetic


【解决方案1】:

我们可以使用 Oracle 日期进行算术运算。从另一个日期中减去一个日期可以得到一个小数的间隔。乘以 86400 得到秒数。所以这是当前的 unix expoch:

(sysdate - date '1970-01-01') * 86400

这意味着您的查询将类似于

select * from your_table
where created_timestamp >= (:last_run_time - date '1970-01-01') * 86400

诀窍是您的调度程序需要在上一次运行的时间中传递 - last_run_time - 以获取从那时起添加的所有记录。

【讨论】:

    【解决方案2】:

    你可以做闪回查询

    SELECT * FROM TABLE
    AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE);
    

    【讨论】:

    • 目标列是一个 Unix 纪元时间戳。所以它的内容可能与数据库系统时间戳不同
    • @APC 是否需要 epoch 列?没有它就不行吗?
    • 问题是要求根据列的内容获取一组记录。鉴于我们不知道created_timestamp 是如何或何时填充的,我们无法确定与数据库系统时间戳是否完全对应。因此,我认为您的解决方案可能会产生与 OP 所需的结果集不同的结果集。除此之外,考虑一下如果作业延迟五分钟会发生什么。
    • 尊重您的专业知识,但我仍然不相信。 OP 询问如何获取在一定时间之前记录的记录。这是主要问题。恕我直言,我们通常可以摆脱created_timestamp,会按需要工作。所以我可以将created_timestamp 视为实现的一部分,而不是要求。我不太明白你关于延迟的问题,请澄清。
    • 如果作业有问题并且它从 2:35 而不是 2;30 开始,您的查询将只选取在 2:05 或之后写入数据库的记录。在 2.00 和 2.04 之间写入的记录将会丢失。这让我觉得非常不受欢迎,因为处理所有记录肯定是一项要求。
    猜你喜欢
    • 2011-03-24
    • 2014-10-04
    • 2014-01-25
    • 2012-12-09
    • 2013-03-25
    • 2018-08-03
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多