Я работал над хранимой процедурой, которая проверяет время, а затем извлекает записи за последний полный 24-часовой период между 8 утра и предыдущими 8 утра. Так, например, предположим, что сейчас 10 утра. Хранимая процедура просматривает текущее время, отмечает, что оно прошло более 8 часов утра, и задает выполнение запроса в обратном направлении 24 часа, с 8 часов утра сегодня до 8 часов вчера. Если бы это было, скажем, 7 утра, запрос был бы установлен для проверки с 8 утра вчера до 8 утра накануне. На самом деле это было относительно просто сделать. SP предназначен для извлечения записей для заданий отслеживания отчетов, выполненных за заданный промежуток времени.
Однако они вернулись ко мне и попросили меня изменить хранимую процедуру таким образом, чтобы час, в который заканчивается отчет, и проверенный промежуток времени настраивался из внешнего интерфейса сайта. У меня это работает для TimeSpans больше или равно 24 часов, но у меня проблемы с пролётами под этим. Вот что у меня есть для моей логики в хранимой процедуре -
-- Retrieves data on jobs that completed/completed with errors during a given time span.
DECLARE @Hour NVARCHAR(2)
DECLARE @TimeFrame NVARCHAR(2)
DECLARE @TimeSpan INTEGER
SET @TimeSpan = 24
SET @TimeFrame = 'AM'
SET @Hour = '08'
DECLARE @dateStart DateTime
DECLARE @dateEnd DateTime
IF @TimeSpan < 24 -- Our TimeSpan is under one full day.
BEGIN
IF GETDATE() > DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE())) + (@Hour + ':00:00 ' + @TimeFrame)
BEGIN
SET @dateStart = DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE() - (1 + @TimeSpan))) + (@Hour + ':00:00 ' + @TimeFrame)
SET @dateEnd = DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE())) + (@Hour + ':00:00 ' + @TimeFrame)
END
ELSE
BEGIN
SET @dateStart = DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE() - (2 + @TimeSpan))) + (@Hour + ':00:00 ' + @TimeFrame)
SET @dateEnd = DATEADD(hh, 0, DATEDIFF(hh, 0, GETDATE() - 1)) + (@Hour + ':00:00 ' + @TimeFrame)
END
END
ELSE -- Our TimeSpan is at least one full day.
BEGIN
IF GETDATE() > DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) + (@Hour + ':00:00 ' + @TimeFrame)
BEGIN
SET @dateStart = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE() - (1 + (@TimeSpan/24)))) + (@Hour + ':00:00 ' + @TimeFrame)
SET @dateEnd = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE())) + (@Hour + ':00:00 ' + @TimeFrame)
END
ELSE
BEGIN
SET @dateStart = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE() - (2 + (@TimeSpan/24)))) + (@Hour + ':00:00 ' + @TimeFrame)
SET @dateEnd = DATEADD(D, 0, DATEDIFF(D, 0, GETDATE() - 1)) + (@Hour + ':00:00 ' + @TimeFrame)
END
END
@ Hour, @TimeFrame и @TimeSpan - все параметры, готовые для установки в интерфейсе отчета, и по умолчанию они равны «08», «AM» и 24 соответственно. Я знаю, что установка дневного диапазона работает правильно в части ELSE верхнего уровня if. Я достаточно уверен, что проблема с установкой часового смещения заключается в том, как я использую здесь функции DATEADD и DATEDIFF, но я не смог понять, где именно я делаю свой шаг промаха. Любая помощь здесь будет принята с благодарностью.