我正在整理一份报告来跟踪SQL可用性组中的延迟。我需要找到两次之间的区别。我有server1,database1和time1。我需要将它与server2,database1和time2进行比较。数据存储在表中,新数据将附加到表中。我尝试创建的查询将获得这些新条目(字段Hardened_time_MS_Diff将为NULL),我需要获取主服务器和辅助服务器返回的时间之间的差异。以下是数据的示例:
Server_name Database_name Last_Hardened_Time
Server1 ABC 2015-10-08 10:10:05.180
Server2 ABC 2015-10-08 10:10:05.643
我获取Hardened_time_MS_Diff值的查询如下所示:
Select a1.server_name, a1.database_name,
Case when a1.Last_Hardened_Time >= a2.Last_Hardened_Time
then
DATEDIFF (MS, a2.Last_Hardened_Time, a1.Last_Hardened_Time)
Else
DATEDIFF (MS, a1.Last_Hardened_Time, a2.Last_Hardened_Time)
End as Hardened
FROM [database].[dbo].[ag_latency] a1
JOIN ag_latency a2
ON a1.database_name = a2.database_name
AND a1.server_name <> a2.server_name
where a1.Hardened_time_MS_Diff is NULL
现在它正在返回一些疯狂的数字,并重复一遍。第一次运行它会正常工作。第二次运行我的数据看起来只适用于Last_Hardened_time没有改变的服务器。如果它改变了,我会得到第二批绝对庞大的数字:
Server_name Database_name Last_Hardened_Time Hardened_time_MS_Diff
Server1 ABC 2015-10-09 12:00:05.013 26
Server2 ABC 2015-10-09 12:00:05.040 26
Server1 ABC 2015-10-09 12:15:07.843 -902803
Server2 ABC 2015-10-09 12:15:07.877 -902863
我怎样才能让它做我想做的事?
此外,获取数据的部分位于Powershell中,因此,如果有更简单的方法来操作PoSH中的数据表,然后将数据向下推,请告诉我。
提前致谢!
答案 0 :(得分:0)
简单回答你的问题,当你有多对时间戳时,你的连接条款不会起作用 - 它不仅会加入row1-row2和row3-row4,还会加入row1-row4和row2-row3,后两者对你的报告没有意义。
一种可能的解决方案是消除任何大于阈值的时间差(比如1000 MilliSec,根据您的样本数据)。所以你的where子句看起来像
where a1.Hardened_time_MS_Diff is NULL AND (DATEDIFF (MS, a2.Last_Hardened_Time, a1.Last_Hardened_Time) < 1000 AND DATEDIFF (MS, a2.Last_Hardened_Time, a1.Last_Hardened_Time) > -1000)
另一种解决方案会更强大,但需要您更改表架构。您需要向表中添加一列,指出哪两行是配对的。例如,将1分配给前两行,将2分配给最后两行,然后通过此列连接表a1和a2。
Key Server_name Database_name Last_Hardened_Time Hardened_time_MS_Diff
1 Server1 ABC 2015-10-09 12:00:05.013 26
1 Server2 ABC 2015-10-09 12:00:05.040 26
2 Server1 ABC 2015-10-09 12:15:07.843 -902803
2 Server2 ABC 2015-10-09 12:15:07.877 -902863
对于powershell部分,您能否详细说明您需要什么?
亨利