首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择具有任意终点的变量TimeSpan

问选择具有任意终点的变量TimeSpan
EN

Stack Overflow用户
提问于 2009-04-29 16:09:51
回答 2查看 734关注 0票数 0

我一直在使用一个存储过程来检查时间,然后检索从上午8点到前一个上午8点这段完整的24小时内的记录例如,假设现在是上午10点存储过程查看当前时间,注意到已超过上午8点,并将查询设置为向后运行24小时,从今天上午8点到昨天上午8点。如果是上午7点,则查询将设置为从昨天上午8点到前一天上午8点进行检查。这实际上是相对简单的操作。SP用于检索在给定时间跨度内完成的跟踪作业的报告的记录。

但是,他们要求我更改存储过程,以便可以从站点的前端配置报告结束的时间和检查的时间跨度。我有这个工作的TimeSpans大于或等于24小时,但我有问题的跨度下。到目前为止,我在存储过程中的逻辑如下:

代码语言:javascript
复制
-- 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函数,但我还不能确定我在哪里犯了错。这里的任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-30 23:21:55

代码语言:javascript
复制
-- 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)
票数 0
EN

Stack Overflow用户

发布于 2009-04-29 17:36:13

为什么不使用这样的查询:

代码语言:javascript
复制
SELECT something
FROM aTable
WHERE timeCompleted BETWEEN @StartDate AND @EndDate

如果您担心时间是否正确(即日期必须是'01/01/1900 13:00:00‘或类似的值),只需传入日期本身并将时间作为函数添加到SQL中即可。

如果这不是您想要的,请包含更多的SQL,以便我们更好地了解您要实现的目标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/803111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档