【问题标题】:Select records where range between two timestamps is less 30 seconds选择两个时间戳之间的范围小于 30 秒的记录
【发布时间】:2016-01-12 02:47:05
【问题描述】:

在 Microsoft SQL Server 2008 R2 中,我试图从一个表中查询记录,该表将作业步骤的开始和结束时间记录为时间戳列,在错误日志表的时间戳列的 30 秒内。错误日志表仅将错误事件记录为标识列,并将事件的日期/时间记录为时间戳,它不包含对导致错误的事件的任何引用。

这是我写的查询(我只需要上周内的记录,因此我的第一个选择语句,它工作得很好):

SELECT 
    js.job_name, js.start_time, js.end_time 
FROM   
    job_step AS js 
WHERE  
    js.end_time > Dateadd(day, -8, Getdate()) 
    AND Datediff(ss, (SELECT el.err_timestamp 
                      FROM   error_log AS el), js.end_time) < 31 

在我添加第二个选择之前,一切正常,但是当我添加该选择时,我收到此错误:

消息 512,第 16 级,状态 1,第 1 行
子查询返回超过 1 个值。当子查询跟随 =、!=、 >、>= 或子查询用作表达式时,这是不允许的。

注意——我不是开发人员,我是产品分析师,但比许多非开发人员对 sql 的掌握要好;也就是说,请记住在您的回复中我不是开发人员/编码人员。

【问题讨论】:

    标签: sql sql-server-2008-r2 timestamp


    【解决方案1】:

    你要么需要correlatesub-query,要么你应该使用TOP 1Order by

    SELECT js.job_name, 
           js.start_time, 
           js.end_time 
    FROM   job_step AS js 
    WHERE  js.end_time > Dateadd(day, -8, Getdate()) 
           AND Datediff(ss, (SELECT TOP 1 el.err_timestamp 
                             FROM   error_log AS el
                             ORDER BY some_col), js.end_time) < 31 
    

    【讨论】:

    • 我理解答案,但不理解。你怎么知道最近的错误时间戳是作业步骤对应的错误?
    • 感谢您的提示。关联起到了作用。现在尝试从与 job_step 表相关的其他表中添加其他列。
    【解决方案2】:

    我会为此目的使用exists

    WHERE js.end_time > Dateadd(day, -8, Getdate()) AND
          EXISTS (SELECT 1
                  FROM error_log el
                  WHERE DATEDIFF(second, el.err_timestamp, js.end_time) < 31
                 );
    

    我猜你真的想要某种“介于”逻辑。也许:

    WHERE js.end_time > Dateadd(day, -8, Getdate()) AND
          EXISTS (SELECT 1
                  FROM error_log el
                  WHERE DATEDIFF(second, el.err_timestamp, js.end_time) BETWEEN -30 AND 30 
                 );
    

    【讨论】:

      【解决方案3】:

      这将在 30 秒内为您提供所有有错误的作业步骤。如果多个错误符合该标准,它可能会在每个作业步骤中为您提供多行,但我希望您会想要。

      SELECT
          JS.job_name,
          JS.start_time,
          JS.end_time,
          EL.event AS potential_error_in_job
      FROM
          dbo.Job_Step JS
      INNER JOIN dbo.Error_Log EL ON
          EL.err_timestamp BETWEEN DATEADD(ss, -30, JS.start_time) AND DATEADD(ss, 30, JS.end_time)
      

      【讨论】:

        猜你喜欢
        • 2012-02-02
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多