Выберите переменную TimeSpan с произвольной конечной точкой - PullRequest
0 голосов
/ 29 апреля 2009

Я работал над хранимой процедурой, которая проверяет время, а затем извлекает записи за последний полный 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, но я не смог понять, где именно я делаю свой шаг промаха. Любая помощь здесь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 01 мая 2009
-- convert the required end hour to 24 hour format
DECLARE @EndHour INT
SET @EndHour = CASE WHEN @TimeFrame = 'AM' THEN @Hour ELSE @Hour + 12 END

-- set @DateEnd to the date-only portion of the current datetime
-- ie, the time portion will be set to 00:00:00
SET @DateEnd = DATEADD(day, 0, DATEDIFF(day, 0, GETDATE()))

-- add the required end hour
SET @DateEnd = DATEADD(hour, @EndHour, @DateEnd)

-- if @DateEnd is in the future then subtract 24 hours from it
IF @DateEnd > GETDATE()
   SET @DateEnd = DATEADD(hour, -24, @DateEnd)

-- set @DateStart by subtracting the required timespan from @DateEnd
SET @DateStart = DATEADD(hour, -@TimeSpan, @DateEnd)
0 голосов
/ 29 апреля 2009

Почему бы просто не использовать запрос вроде:

SELECT something
FROM aTable
WHERE timeCompleted BETWEEN @StartDate AND @EndDate

Если вас беспокоит правильное время (т. Е. Даты должны быть «01/01/1900 13:00:00» или что-то в этом роде), просто передайте дату отдельно и добавьте время как функцию SQL.

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

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