SQL仅显示最近的日期时间值

SQL仅显示最近的日期时间值,sql,sql-server-2008,Sql,Sql Server 2008,我的sql字符串有点乱,需要帮助才能完全正确。我试过很多串,但都没有成功。关于sql,下面是一个屏幕截图,显示的只是结果: 我希望它只显示最近的日期时间值,以便进行精确计算和重新计算 [编辑,将我的两个部分拆分为两个独立的问题。这是sql问题,我将为其中的visual studio部分做另一个问题。]要选择具有最新日期时间值的条目,请按该列对结果排序,然后选择前1项: 按[DateTime]说明从中选择前1个订单 我无法回答第二个问题,但建议使用ADO.NET 这里是一个按标记名查找最近日期时间

我的sql字符串有点乱,需要帮助才能完全正确。我试过很多串,但都没有成功。关于sql,下面是一个屏幕截图,显示的只是结果:

我希望它只显示最近的日期时间值,以便进行精确计算和重新计算


[编辑,将我的两个部分拆分为两个独立的问题。这是sql问题,我将为其中的visual studio部分做另一个问题。]

要选择具有最新日期时间值的条目,请按该列对结果排序,然后选择前1项: 按[DateTime]说明从中选择前1个订单


我无法回答第二个问题,但建议使用ADO.NET

这里是一个按标记名查找最近日期时间值的查询

SELECT A.[DateTime]
 ,A.[TagName]
 ,A.[Value]
FROM [v_StringHistory] A 
INNER JOIN 
    (SELECT MAX(B.[DateTime]) [MaxDate]
         ,B.[TagName]
    FROM [v_StringHistory] B
    GROUP BY B.[TagName]) MD
      ON MD.[TagName] = A.[TagName] 
           AND A.[DateTime] = MD.MaxDate
WHERE A.[TagName] = 'ERecipeRunning' 
    OR A.[TagName] = 'PRecipeRunning'

这是我一直使用的一个简单版本。查看


对于这个特定的前端Wonderware,显然有一些关于如何查询其表的规则。幸运的是,他们有一个GUI,允许您选择并单击您想要查看的内容,然后它会输出SQL代码。在本例中,代码最终为:

SET NOCOUNT ON
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = DateAdd(mi,-5,GetDate())
SET @EndDate = GetDate()
SET NOCOUNT OFF
SELECT  * FROM (
SELECT History.TagName, DateTime = convert(nvarchar, DateTime, 21), Value, vValue, StartDateTime
 FROM History
 WHERE History.TagName IN ('ERecipeRunning', 'PRecipeRunning')
 AND wwRetrievalMode = 'Cyclic'
 AND wwCycleCount = 2
 AND wwVersion = 'Latest'
 AND DateTime >= @StartDate
 AND DateTime <= @EndDate) temp WHERE temp.StartDateTime >= @StartDate
ORDER BY DateTime DESC

我忘记了查询应用程序及其提供的SQL代码。在我的搜寻和猜测中,我甚至没有选择相同的表/视图。但最终,这是有效的,我很好。感谢大家的建议。

您为什么仍然使用ADODB而不是ADO.NET?可能是因为我不知道更好的原因。当我最近编写Excel VBA脚本时,我使用了它,所以我对它很熟悉。我愿意以不同的方式连接到sql。这里有两个独立的问题,所以你需要在单独的帖子中问每个问题。SQL专家不一定是Winforms专家。把问题分开,你会得到更好的答案。而且,这样做可能会导致问题被关闭。好的。我将它们分成不同的线程。使用ADO.NET有什么好处?这对显示每个标记的两个值有用吗,还是只显示最近的单个标记?这很有用,谢谢!这比我想象的要复杂。我更新了sql FIDLE:当我在实际数据库中使用时,会收到一条错误消息。但它在sql中工作。我认为错误消息与填充它的系统类型有关。链接服务器INSQL返回的消息历史查询的OLE DB提供程序INSQL必须至少包含一个有效标记名。Msg 7320,第16级,状态2,第48行无法执行查询选择Tbl1004.DateTime Col1010,Tbl1004.TagName Col1011 FROM Runtime.dbo.StringHistory Tbl1004,其中Tbl1004.TagName>=N'ERecipeRunning'和Tbl1004.TagName本应表示它在sql FIDLE中工作,但不是我的实际数据库,因为供应商正在使用某个链接表作为前端的一部分。因此,在SQL中可能无法做到这一点。SQL Fiddle示例工作得很好,我相信我之前已经尝试过这一点,但在实际的databaase中没有任何效果。前端是一些称为Wonderware的工业软件,显然它正在使用一些链接表来生成我所投票反对的视图,而它们与这些脚本的某些部分不兼容。谷歌发现其他人也在同一条船上,但没有解决办法。与上述错误消息相同:链接服务器INSQL的OLE DB provider INSQL返回的消息历史查询必须至少包含一个有效标记名。
SET NOCOUNT ON
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
SET @StartDate = DateAdd(mi,-5,GetDate())
SET @EndDate = GetDate()
SET NOCOUNT OFF
SELECT  * FROM (
SELECT History.TagName, DateTime = convert(nvarchar, DateTime, 21), Value, vValue, StartDateTime
 FROM History
 WHERE History.TagName IN ('ERecipeRunning', 'PRecipeRunning')
 AND wwRetrievalMode = 'Cyclic'
 AND wwCycleCount = 2
 AND wwVersion = 'Latest'
 AND DateTime >= @StartDate
 AND DateTime <= @EndDate) temp WHERE temp.StartDateTime >= @StartDate
ORDER BY DateTime DESC