2016-01-08 50 views
-2

我一直在编写一个网站(使用ASP),显示从前一天的下午6点开始直到页面加载的时间戳的表格数据。SQL选择命令忽略,直到满足条件

我已经完成了。

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

我几乎失去了。

这里是我的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 

这是我目前得到数据:我期待不顾一切之前MessageNumber = 27

+0

这是特定条件你正在寻找?它是'M.FolderNo = @ DropSelect'还是总是需要检查,并且你在谈论另一个条件。如果您要提供示例数据和预期输出,这将会很有帮助。 – trincot

+0

嗨。非常感谢您的回复。我想在M.MessageNumber = 27后显示所有内容。@DropSelect只是一个下拉列表,所以我可以选择正确的文件夹(基本上是M.FolderNo) –

+0

@trincot我不能在这里发布示例数据..它太多了进入这里..但我采取了截图。 [链接](http://www.neebong.co.uk/files/events.png)..我想在MessageNumber = 27之前忽略所有内容 –

回答

0

你可以先选择第一个纪录的时间

enter image description here

特殊条件,在一个子选择(我把它放在一个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。请注意,由于小提琴只有很少的数据,因此如果在今天之后执行,它将不会返回任何记录。

还要注意的是你的“在昨天18:00”计算方式可以做很多更有效率的,因为我已经包含在上面查询:

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())) 
+0

这工作出色!我永远不会解决这个问题!感谢您的帮助(并编辑我的问题,使其有意义)@trincot –

+0

不客气。 – trincot