【问题标题】:Finding any rows where the latest event time is over a specified period查找最新事件时间超过指定时间段的任何行
【发布时间】:2009-12-17 09:25:41
【问题描述】:

这与我试图用 SQL 编写自动化的 OpenNMS 相关。我有一个系统,每次备份成功时都会将事件发送到表中。我想检测任何给定节点的备份是否过期。因此,例如(简化的)表格如下所示:

nodeid, eventid, eventuei, eventtime
  1   ,  1     , backupOk, 09:20 15/12/09
  2   ,  2     , backupOk, 09:25 15/12/09
  3   ,  3     , backupOk, 09:30 15/12/09
  1   ,  4     , backupOk, 09:20 16/12/09
  2   ,  5     , backupOk, 09:25 16/12/09
  2   ,  6     , backupOk, 09:25 17/12/09
  3   ,  7     , backupOk, 09:30 17/12/09

所以我需要的是一个 nodeid 的列表,其中备份已过期 24 小时(我猜想根本没有发生备份,尽管该数据库中有没有备份的节点(因为它们是不同类型的节点))。

【问题讨论】:

    标签: sql postgresql opennms


    【解决方案1】:

    无法从您向我们展示的架构中获取未备份的节点列表。

    获取逾期 24 小时的节点列表很简单:

    select nodeid, max(eventtime)
    from your_table
    group by nodeid
    having max(eventtime) < now() - '24 hours'::interval
    

    【讨论】:

    • 还需要什么额外信息?例如,我可以执行另一个查询,列出所有应该在其上运行备份的 nodeid。
    【解决方案2】:

    以下 SQL 适用于 Oracle,但我假设 PostgreSQL 中有类似的时间处理工具:

    SELECT E.NODEID, E.LAST_BACKUP_TIME
      FROM (SELECT NODEID, MAX(EVENTTIME) AS LAST_BACKUP_TIME
              FROM BACKUP_EVENTS
              WHERE EVENTUEI = 'backupOk'
              GROUP BY NODEID) E
      WHERE E.LAST_BACKUP_TIME < SYSDATE - INTERVAL '2' DAY;
    

    这将报告过去 48 小时内未运行备份的节点。

    分享和享受。

    【讨论】:

    • 只是一些小改动,应该没问题:“SYSDATE”变成“now()”,“INTERVAL '2' DAY”变成“'2 days'::interval”或“interval '2天”
    猜你喜欢
    • 2023-03-21
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2015-11-02
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多