我一直在编写一个网站(使用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
以下是我目前获得的数据:
我想在MessageNumber = 27之前忽略所有内容
答案 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()))