选择两个时间戳之间的范围小于30秒的记录

时间:2016-01-11 18:08:38

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

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

这是我写的查询(我只需要上周的记录,因此我的第一个select语句,它运行得很好):

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 

直到我添加第二个选择,一切正常,但是当我添加select时,我收到此错误:

  

Msg 512,Level 16,State 1,Line 1
  子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;时,不允许这样做。 &gt;,&gt; =或当子查询用作表达式时。

注意 - 我不是开发人员,我是产品分析师,但是比许多非开发人员对sql的掌握要好于平均水平;那说,请记住在你的回复中我不是开发人员/编码员。

3 个答案:

答案 0 :(得分:1)

您需要correlate sub-query,或者您应TOP 1使用Order 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 

答案 1 :(得分:0)

我会使用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
             );

我猜你真的想要某种&#34;之间的#34;逻辑。也许:

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 
             );

答案 2 :(得分:0)

这将为您提供在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)