我一直在使用一个存储过程来检查时间,然后检索从上午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函数,但我还不能确定我在哪里犯了错。这里的任何帮助都将不胜感激。
发布于 2009-04-30 23:21:55
-- 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)发布于 2009-04-29 17:36:13
为什么不使用这样的查询:
SELECT something
FROM aTable
WHERE timeCompleted BETWEEN @StartDate AND @EndDate如果您担心时间是否正确(即日期必须是'01/01/1900 13:00:00‘或类似的值),只需传入日期本身并将时间作为函数添加到SQL中即可。
如果这不是您想要的,请包含更多的SQL,以便我们更好地了解您要实现的目标。
https://stackoverflow.com/questions/803111
复制相似问题