【问题标题】:Trying to a Select Count where it needs to count the difference between a certain date and current date尝试选择计数,它需要计算某个日期和当前日期之间的差异
【发布时间】:2019-03-20 13:26:28
【问题描述】:

这对我来说不太有效!

我的查询如下:

SELECT COUNT (*) as [generic] 
FROM [Log]
Where value IN (Select ID, tsSendDocument, sysReceivedFrom
WHERE sysReceivedFrom = 'generic' AND 
DATEDIFF(hour, tsSendDocument, GetDate()) > 2) 

那么,我在这里做错了什么?

我希望它在每次 tsSendDocument 列超过 2 小时时计数。它最终会给我一个等于 1 的计数。如果值 = 1,我设置了一个表来提醒我,这意味着 tsSendDocument 超过 2 小时。

这有意义吗?

【问题讨论】:

  • 提供样本数据和期望的结果。
  • 您在 cmets 中提到了只想要最新的内容。不确定你的意思。我们需要样本数据和所需的输出以及对业务规则的完整说明。
  • 好吧。我有一家小型企业,我在其中接收文件,将它们转换为某种格式并将它们发送给接收者。我想确保发送的文件是源源不断的,因此要确保发送的文件总是少于两小时。如果我发送的最后一份文件超过两个小时,这可能意味着我的服务有问题。然后我想做一个选择计数查询。如果最后一个文档早于几小时,则计数结果将等于 1。如果它更年轻,则为 0。这就是为什么我只希望它计算最后一个表条目。

标签: sql sql-server datetime datediff ssms-2014


【解决方案1】:

根据您的评论,我了解到您想检查最后一个条目是否超过 2 小时,所以这应该可以:

SELECT TOP 1 CASE WHEN tsSendDocument < DATEADD(HOUR, -2, GETDATE()) THEN 1 ELSE 0 END AS [generic]
FROM [Log]
ORDER BY tsSendDocument DESC

【讨论】:

  • 是的!非常感谢!很抱歉描述的模糊,我现在正在慢慢学习 SQL。
【解决方案2】:

我认为你只想要聚合:

Select COUNT(*) 
FROM Log
WHERE sysReceivedFrom = 'generic' AND 
      DATEDIFF(hour, tsSendDocument, GetDate()) > = 2;

当您指定INNOT IN 子句时,subquery 只会返回一个表达式。

【讨论】:

  • 但问题是我只希望它依靠最新的条目。否则,它目前将计入整个表,其中包含许多超过两小时的条目。它必须是最新的条目,以便如果最新条目早于 2 小时,计数结果将为 1。
  • 这看起来不错,但在这里使用 DATEDIFF 时要小心。它只查看跨越的日期阈值。所以这可能会返回相隔一个多小时的行。这也不是 SARGable。使用“Where tsSendDocument
  • 谢谢你,肖恩。那我怎么把它限制在第一行呢?有想法吗?
猜你喜欢
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2013-08-20
  • 2017-10-17
  • 2019-01-24
相关资源
最近更新 更多