守护进程在SQL Server中有条件地监视查询和发送邮件

时间:2011-07-20 20:41:39

标签: sql sql-server sql-server-2005 tsql monitoring

我一直在为一个特殊的请求融化我的大脑:每两分钟执行一次查询,如果它返回行,请发送一封电子邮件。这已经完成并交付,到目前为止一直很好。查询的结果集如下:

+----+---------------------+
| ID | last_update         |
+----+---------------------|
| 21 | 2011-07-20 13:03:21 |
| 32 | 2011-07-20 13:04:31 |
| 43 | 2011-07-20 13:05:27 |
| 54 | 2011-07-20 13:06:41 |
+----+---------------------|

当用户要求我修改它以便解决方案以便例如,第一次捕获ID 21超过5分钟时,电子邮件将被发送对一组特定的收件人;第二次,当ID 21在5到10分钟之间时,选择另一组接收者。到目前为止还可以。对我来说,问题是从第三次开始:电子邮件现在每半小时发送一次,而不是每五分钟发送一次。

我应该如何跟踪先生ID = 43的状态?我怎么知道他是否已收到两三个电子邮件?如何确保从第三封电子邮件开始,邮件每半小时发送一次,而不是通常的5分钟?

1 个答案:

答案 0 :(得分:0)

我觉得你认为这可以用一个简单的数学公式解决。它可能是,只要您的系统可靠。

在谐波函数图上,每30分钟可被视为360度或2 pi弧度。那是12度= 1分钟。我们以cosin为例:

f(x) = cos(x)
f(x) = cos(elapsedMinutes * 12 degrees)

经过的分钟数是自第一次30分钟更新到期后的时间。这应该是last_update值的常量分钟数。

由于你有一个两分钟的错误窗口,如果f(x)(上面)的值在你之前或之后不到一分钟得到的值之间,那么将是时间传输30分钟的更新预定的更新。哪个是= cos(1 * 12度)= 0.9781476007338056379285667478696。

将所有内容整合在一起,如果此SQL表达式为真,则可以发送30分钟更新:

COS(RADIANS( 12 * DATEDIFF(minutes, 
   DATEADD(minutes, constantNumberOfMinutesBetweenSecondAndThirdUpdate, last_update), 
   CURRENT_TIMESTAMP))) > 0.9781476007338056379285667478696

如果您需要比两分钟更宽的窗口,请稍微降低此数字。