Демон для мониторинга запросов и условной отправки почты в SQL Server - PullRequest
0 голосов
/ 21 июля 2011

Я таял свои мозги над особым запросом: каждые две минуты выполняй определенный запрос, и если он возвращает строки, отправляй им по электронной почте. Это было уже сделано и доставлено, пока все хорошо . Результирующий набор запроса выглядит так:

+----+---------------------+
| 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 |
+----+---------------------|

Проблема начинается, когда пользователь просит меня изменить ее, чтобы решение, таким образом, например, , при первом обнаружении идентификатора 21 старше 5 минут, электронное письмо отправляется на адрес определенный набор получателей; во второй раз, когда ID 21 от 5 до 10 минут, выбирается другой набор получателей. Пока все в порядке. Гоча для меня с третьего раза: электронные письма теперь отправляются каждые полчаса, а не каждые пять минут.

Как мне следить за состоянием Mr. ID = 43? Как бы я узнал, если он уже получил электронное письмо, два или три? И как обеспечить, чтобы начиная с третьего электронного письма, письма отправлялись каждые полчаса вместо обычных 5 минут?

1 Ответ

0 голосов
/ 21 июля 2011

У меня сложилось впечатление, что вы думаете, что это можно решить с помощью простой математической формулы.И, вероятно, это возможно, если ваша система надежна.

Каждые тридцать минут можно увидеть как 360 градусов или 2 пи радианы на графике гармонических функций.Это 12 градусов = 1 минута.Например, косинус:

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

Где истекшие минуты - это время с момента выхода первых 30-минутных обновлений.Это должно быть постоянное количество минут, добавляемых к значению last_update.

Поскольку у вас есть двухминутное окно с ошибкой, будет время передать 30-минутное обновление, если значение f (x)(выше) находится между значением, которое вы получите менее чем за одну минуту до или после запланированного обновления.Что было бы = cos (1 * 12 градусов) = 0,9781476007338056379285667478696.

Собрав все вместе, пришло время отправить тридцатиминутное обновление, если это выражение SQL истинно:

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

Есливам нужно более широкое окно, чем ровно две минуты, просто немного уменьшите это число.

...