我一直工作在一个存储过程,检查时间的变量时间跨度,然后检索记录可以追溯到在上午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函数,但是我一直无法弄清楚我在哪里做出我的错误步骤。任何帮助在这里将不胜感激。
啊,这很好,一旦我将小时改为一个整数而不是nvarchar。非常感谢,非常感谢帮助! – Clyde 2009-05-04 23:44:01