【问题标题】:SQL Show Only the Most Recent DateTime ValuesSQL 仅显示最近的 DateTime 值
【发布时间】:2015-05-30 13:19:34
【问题描述】:

我的 sql 字符串有点不对劲,我需要帮助才能完全正确。我尝试了许多没有运气的字符串。 I've tried most of the examples in this thread, with no luck.关于sql,这里是它的截图,只是结果:

我希望它只显示 PRecipeRunning 和 ERecipeRunning 的最新 DateTime 值。

I have setup a SQLFiddle here, with the schema and the grab everything code.

[编辑,将我的两个伙伴分成两个单独的问题。这是 sql 问题,我将为它的 Visual Studio 部分做另一个。]

【问题讨论】:

  • 您为什么仍然使用 ADODB 而不是 ADO.NET?
  • 可能是因为我不知道更好。当我最近做一个 Excel VBA 脚本时,它就是我使用的,所以我很熟悉它。我愿意以不同的方式连接到 sql。
  • 您在这里有 2 个单独的问题,因此您需要在单独的帖子中询问每个问题。 SQL 专家不一定是 Winforms 专家。通过分离问题,您将获得更好的答案。此外,保持这种状态可能会导致问题被关闭。
  • 好的。我将它们分成单独的线程。

标签: sql sql-server-2008


【解决方案1】:

这是一个通过 TagName 查找最新日期时间值的查询

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'

【讨论】:

  • 这行得通,谢谢!这比我预期的要复杂。我更新了 sql fiddle:sqlfiddle.com/#!6/d6332/11/0
  • 当我在我的实际数据库中使用时,我收到一条错误消息。但它适用于sql。我认为错误消息与填充它的系统类型有关。 OLE DB provider "INSQL" for linked server "INSQL" returned message "History queries must contain at least one valid tagname". Msg 7320, Level 16, State 2, Line 48 Cannot execute the query "SELECT Tbl1004.DateTime Col1010,Tbl1004.TagName Col1011 FROM Runtime.dbo.StringHistory Tbl1004 WHERE Tbl1004.TagName>=N'ERecipeRunning' AND Tbl1004.TagName<=N'PRecipeRunning'" against OLE DB provider "INSQL" for linked server "INSQL".
  • 这应该说它在 sql fiddle 中工作,但不是我的实际数据库,因为供应商正在使用一些链接表作为前端的一部分。所以在 SQL 中可能无法做到。
【解决方案2】:

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

SELECT  sh.[DateTime],
        sh.[TagName],
        sh.[Value]
  FROM  [v_StringHistory] sh
WHERE   sh.[TagName] in( 'ERecipeRunning', 'PRecipeRunning' )
  and   sh.[DateTime] =(
        select  Max( [DateTime] )
        from    [v_StringHistory]
        where   [TagName] = sh.[TagName] );

【讨论】:

  • SQL Fiddle 示例运行良好,我相信我之前已经尝试过,但在实际数据库中没有骰子。前端是一些名为 Wonderware 的工业软件,显然它正在使用一些链接表来生成我正在轮询的视图,并且它们不能很好地与这些脚本的某些部分配合使用。谷歌发现其他人在同一条船上,但没有修复。与上述相同的错误消息:“链接服务器“INSQL”的 OLE DB 提供程序“INSQL”返回消息“历史查询必须包含至少一个有效的标记名”。
【解决方案3】:

对于这个特定的前端 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 代码。在我的狩猎和猜测中,我什至没有选择同一个表/视图。但最后,这是有效的,我很好。感谢大家的建议。

【讨论】:

    【解决方案4】:

    要选择具有最新日期时间值的条目,请按该列对结果进行排序并选择前 1 个: SELECT TOP 1 &lt;columns&gt; FROM &lt;table&gt; WHERE &lt;condition&gt; ORDER BY [DateTime] DESC

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

    【讨论】:

    • 使用 ADO.NET 有什么好处?这适用于显示每个标签的两个值,还是只显示最近的单个标签?
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 2023-03-31
    • 2020-07-03
    • 2016-06-04
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多