2009-04-29 56 views
0

我一直工作在一个存储过程,检查时间的变量时间跨度,然后检索记录可以追溯到在上午8点和以前的上午8点之间的最后完整的24小时的时间。例如,假设它现在是上午10点。存储过程查看当前时间,注意到它已经过了上午8点,并将查询设置为从现在的上午8点到昨天上午8点24小时后退。如果是,例如上午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函数,但是我一直无法弄清楚我在哪里做出我的错误步骤。任何帮助在这里将不胜感激。

回答

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, [email protected], @DateEnd) 
+0

啊,这很好,一旦我将小时改为一个整数而不是nvarchar。非常感谢,非常感谢帮助! – Clyde 2009-05-04 23:44:01

0

为什么不直接使用类似的查询:

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

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

如果这是你正打算不是请包括更多的SQL使我们更好地了解您所要完成什么。

+0

这实际上就是按照上述数额的select语句。 select语句很简单。 问题在于正确计算正确的日期以确定范围。在几天内选择一个范围很容易,代码已经可以达到这个效果。但是,他们希望同一份报告能够选择一小段时间,这就是问题所在。无论是在VB后端还是SQL Server中完成,在某个时刻我都必须计算出被选中的确切时间范围。 – Clyde 2009-05-04 23:30:59