选择具有任意端点的Variable TimeSpan

时间:2009-04-29 16:09:51

标签: asp.net vb.net sql-server-2005

我一直在研究一个检查时间的存储过程,然后检索在上午8点到早上8点之间的最后一个完整24小时内回溯的记录。因此,例如,假设它目前是上午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。我知道设置日期范围在顶级if的ELSE部分正常工作。我有理由确定设置小时偏移的问题在于我如何在这里使用DATEADD和DATEDIFF函数,但是我无法弄清楚我在哪里做了我的错过步骤。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

为什么不使用如下的查询:

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

如果你担心时间正确(即日期必须是'01 / 01/1900 13:00:00'或类似的东西),只需自己传递日期并将时间作为函数添加SQL。

如果这不是您想要的,请包含更多SQL,以便我们更好地了解您要完成的任务。

答案 1 :(得分:0)

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