SQL选择要忽略的命令,直到满足条件

时间:2016-01-08 23:32:07

标签: sql sql-server

我一直在编写一个网站(使用ASP),该网站显示从前一天下午6点到加载页面时间戳的表格中的数据。

我已经完成了。

但为了改进这一点,我只想要在具有特定条件的特定记录之后发生的记录。因此,在select语句(按时间戳排序)中忽略特定记录之前的所有内容。

我几乎失去了。

这是我的SQL选择,任何帮助都将不胜感激。

SELECT M.ProductionID, M.FolderNo, M.SetDatetime, M.MessageNumber, 
       M.MessageText, M.MessageLocation, MD.GrossCopies, MD.NetCopies,
       MD.Speed 
FROM   ST3ROTE_Message AS M 
LEFT OUTER JOIN ST3ROTE_MessageData AS MD 
             ON M.MessageID = MD.MessageID 
WHERE  M.FolderNo = @DropSelect 
AND    (M.SetDatetime BETWEEN 
           CONVERT (DateTime, CONVERT (nchar(4), DATEPART(YYYY, GETDATE())) 
                 + '-' + CONVERT (nchar(2), DATEPART(MM, GETDATE())) 
                 + '-' + CONVERT (nchar(2), DATEPART(DD, GETDATE()) - 1)
                 + ' 18:00:00') AND CURRENT_TIMESTAMP) 
ORDER BY M.MessageID

以下是我目前获得的数据:

enter image description here

我想在MessageNumber = 27之前忽略所有内容

1 个答案:

答案 0 :(得分:0)

您可以先在子选择中选择具有特殊条件的第一条记录的时间(我将其放在with子句中)。这将为每个文件夹返回一个记录。然后选择时间戳不小于该时间戳的同一文件夹的所有记录:

WITH StartRec AS ( 
    SELECT  FolderNo, MIN(SetDatetime) SetDatetime
    FROM    ST3ROTE_Message
    WHERE   FolderNo = @DropSelect
        AND MessageNumber = 27 -- your starting condition
        AND SetDatetime BETWEEN 
              DATEADD(hour, 18, DATEDIFF(day, 1, GETDATE())) 
              AND CURRENT_TIMESTAMP
    GROUP BY FolderNo)
SELECT     M.ProductionID, M.FolderNo, M.SetDatetime, 
           M.MessageNumber, M.MessageText, M.MessageLocation, 
           MD.GrossCopies, MD.NetCopies, MD.Speed 
FROM       ST3ROTE_Message AS M
INNER JOIN StartRec
        ON StartRec.FolderNo = M.FolderNo 
       AND StartRec.SetDatetime <= M.SetDatetime
LEFT JOIN  ST3ROTE_MessageData AS MD
        ON M.MessageID = MD.MessageID 
WHERE      M.FolderNo = @DropSelect

这是fiddle。请注意,由于小提琴只使用很少的数据,因此如果在今天之后执行,它将不会返回任何记录。

另请注意您的计算方式&#34;昨天18:00&#34;可以提高效率,因为我已经包含在上面的查询中:

DATEADD(hour, 18, DATEDIFF(day, 1, GETDATE())) 

首先计算第1天(最早的日期值为0)和现在之间的整天数。然后将其用作添加18小时的日期(=昨天0:00)。

由于您在评论中说 SetDateTime 反映了发生的事件的时间戳,并且永远不会是将来的某个时间,因此您并不需要BETWEEN条件。你可以替换:

        SetDatetime BETWEEN 
          DATEADD(hour, 18, DATEDIFF(day, 1, GETDATE())) 
          AND CURRENT_TIMESTAMP

人:

        SetDatetime >= DATEADD(hour, 18, DATEDIFF(day, 1, GETDATE()))