获取过去 30 分钟内未更新的记录

use*_*786 3 t-sql

我正在尝试编写一个脚本,该脚本将获取超过 30 分钟未更新表的记录。

示例记录:

DNS_NAME    LAST_PERF_TIME
esxnu01 2013-12-24 12:10:00.000
esxnu02 2013-12-24 12:05:00.000
esxnu01 2013-12-24 12:15:00.000
esxnu03 2013-12-24 12:05:00.000
esxnu04 2013-12-24 12:20:00.000
esxnu02 2013-12-24 12:25:00.000

CREATE TABLE [dbo].[VPX_HOST](
[DNS_NAME] [nvarchar](255) NOT NULL,
[LAST_PERF_TIME] [datetime] NULL)


INSERT INTO [dbo].[VPX_HOST]
      ([DNS_NAME],[LAST_PERF_TIME])
 VALUES
      ('esxnu01', '2013-12-24 12:10:00.000')
      ,('esxnu02','2013-12-24 12:05:00.000') 
      ,('esxnu01','2013-12-24 12:15:00.000')
      ,('esxnu03','2013-12-24 12:05:00.000')
      ,('esxnu04','2013-12-24 12:20:00.000')
      ,('esxnu02','2013-12-24 12:25:00.000')
Run Code Online (Sandbox Code Playgroud)

Bre*_*zar 10

同一台服务器将多个更新记录到VPX_HOST表中(我猜它看起来像 VMware 的虚拟中心)所以这有点棘手。

从技术上讲,这就是您要求的:

SELECT DISTINCT DNS_NAME
FROM dbo.VPX_HOST no_updates
WHERE NOT EXISTS (SELECT * FROM dbo.VPX_HOST updates WHERE no_updates.DNS_NAME = updates.DNS_NAME AND updates.LAST_PERF_TIME > DATEADD(mm, -30, GETDATE()))
ORDER BY DNS_NAME
Run Code Online (Sandbox Code Playgroud)

但你实际上不会喜欢它,因为如果你DNS_NAME永久离线,就像你扔掉一个主机,它会继续出现在这里。因此,让我们修改查询,使其仅包含在最后一天添加条目的主机,而不是在过去 30 分钟内添加的主机:

SELECT DISTINCT DNS_NAME
FROM dbo.VPX_HOST no_updates
WHERE no_updates.LAST_PERF_TIME > DATEADD(dd, -1, GETDATE())
AND NOT EXISTS (SELECT * FROM dbo.VPX_HOST updates WHERE no_updates.DNS_NAME = updates.DNS_NAME AND updates.LAST_PERF_TIME > DATEADD(mm, -30, GETDATE()))
ORDER BY DNS_NAME
Run Code Online (Sandbox Code Playgroud)

WHERE第三行的第一个条款说只给我在最后一天更新的服务器。如果你想回到更远的地方,你可以将 dd, -1 更改为类似 dd, -3 的内容以返回 3 天。

编辑性能- 请注意,这将扫描VPX_HOST表,因此该表越大,此查询将变得越慢。如果您要经常运行它,您可能需要在(DNS_NAME, LAST_PERF_TIME).