Интересное обнаружение параметров SSRS при использовании подписок - PullRequest
0 голосов
/ 01 октября 2018

Недавно я составлял отчет SSRS, который будет выполняться каждые 15 минут в течение предыдущих 15-минутных «отрезков» времени.По сути, это очень простой и понятный отчет, который будет запускаться через автоматическую подписку.

Я использовал Microsoft SQL Server 12 Report Builder версии 3.

Меня предупредили о проблеме с выводомcsv, когда мой получатель сообщил об отправке пустых файлов, что наиболее странно, если учесть, что отчет, сгенерированный, как и ожидалось, запускался вручную.

Короче говоря, это были выражения, которые я использовал для генерации дат От и До.Запуски вручную произведенных данных, запуски подписки - нет.

Исходные параметры

FromDate

dateadd(DateInterval.Second, (second(now()) + 900) * -1, dateadd(Dateinterval.Minute, (minute(now()) mod 15) * -1, now()))

ToDate

dateadd(DateInterval.Second, (second(now()) + 1) * -1, dateadd(Dateinterval.Minute, (minute(now()) mod 15) * -1, now()))

Новые параметры

FromDate

dateadd(DateInterval.Minute, -15, dateadd(DateInterval.Minute, cint(datediff(DateInterval.Minute,today(),now()) / 15) * 15, today()))

ToDate

dateadd(DateInterval.Second, 899,Parameters!FromDate.Value)

Думал, что я опубликую это здесь по двум причинам

  1. Теории о том, почему
  2. Это может помочь кому-то в будущем

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Ваши исходные параметры берут Now и вычитают минуты, чтобы получить 15-минутное время, затем они берут секунды другого Now (что позже и может быть в следующую секунду или даже минуту) и вычитаютэто значение для получения в 0 секунд (или 59 секунд).Это может уже вызывать проблему, когда между первым и вторым значением Now есть изменение секунд, что не очень однозначно, поскольку в моей тестовой системе между двумя оценками Now в * было 0,59 секунды.1005 * FromDate параметр.Кроме того, значение Now является более точным, чем секунда, и ваша формула не учитывает это.Поэтому, если записи, которые вы пытаетесь обработать в своем отчете, имеют время ровно четверть часа, первый параметр наверняка больше (возможно, на 0,01 секунды), и поэтому запись игнорируется.

Ваша формула для «новых параметров» не зависит от секунд, равных Now(), и всегда будет возвращать время без доли секунды, поэтому я думаю, что именно это и имеет значение.

Выражение для FromDate можно немного упростить:

=Today.AddSeconds(900*(DateDiff(DateInterval.Minute, Today, Now)\15-1))

Если вы не планируете запускать отчет очень быстро до полуночи, не должно быть проблем, вызванных изменениемдень во время оценки Today и Now, и вы можете рассчитать второй параметр аналогичным образом, независимо от первого:

=Today.AddSeconds(900*(DateDiff(DateInterval.Minute, Today, Now)\15)-1)
0 голосов
/ 01 октября 2018

Исходные значения параметров рассчитывались индивидуально, что означает, что у каждого из них будут немного разные значения для Now().Я знаю, что это длинный выстрел, но это теория.Если задание подписки сработало за долю секунды до 15-минутного интервала, возможно, что ToDate вернулось непосредственно перед FromDate.Это приведет к неверному диапазону дат.

В новых выражениях ToDate ссылается на FromDate, что вынуждает их вычислять последовательно, а не параллельно.Не говоря уже о том, что вы добавляете к FromDate, что также заставляет диапазон дат иметь одинаковую длину.Тем не менее, вы все равно можете столкнуться со случаем, когда вы получите один и тот же отчет дважды, если FromDate рассчитывается не с той стороны 15-минутного отсечения.

Один из способов проверить / избежать этой проблемы - этокомпенсировать время подписки, чтобы он не пытался стрелять с точными 15-минутными отсечками.Например, вы можете назначить его на 1 минуту позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...