【发布时间】:2009-04-29 16:09:50
【问题描述】:
我一直在研究一个检查时间的存储过程,然后检索从上午 8 点到前一个上午 8 点之间的最后一个完整 24 小时期间的记录。因此,例如,假设现在是上午 10 点。存储过程查看当前时间,指出它已超过上午 8 点,并将查询设置为 24 小时向后运行,从今天上午 8 点到昨天上午 8 点。例如,如果是上午 7 点,则查询将设置为从昨天上午 8 点到前一天上午 8 点进行检查。这实际上相对简单。 SP 旨在用于检索在给定时间跨度内完成的报告跟踪作业的记录。
但是,他们回过头来要求我更改存储过程,以便报告结束的时间和检查的时间跨度可以从网站的前端进行配置。我的 TimeSpan 工作时间大于或等于 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 函数,但我无法弄清楚我在哪里错过了一步。在这里的任何帮助将不胜感激。
【问题讨论】:
标签: asp.net vb.net sql-server-2005