我一直在研究一个检查时间的存储过程,然后检索在上午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函数,但是我无法弄清楚我在哪里做了我的错过步骤。非常感谢任何帮助。
答案 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)