1

我在存储过程中有一个 if 语句,用于派生一些时间值。它看起来像这样:

    DECLARE @foo TIME
    IF (SELECT CONVERT(TIME,SYSUTCDATETIME())) > '15:00'
        SET @foo = DATEADD(hh,-15,CONVERT(TIME,SYSUTCDATETIME()))
    ELSE
        SET @foo = DATEADD(hh,+9,CONVERT(TIME,SYSUTCDATETIME()))

稍后我想在以下 WHERE 子句中使用该值:

AND created_at > DATEADD(hh,-@DailyLimitOffsetTime, CONVERT(TIME,SYSUTCDATETIME()))

我不断收到一个错误,即数据类型时间对于减号运算符无效。我怎样才能解决这个问题以使 and 子句起作用。我已经尝试转换数据类型,并且我有点理解 DATEADD(hh) 正在寻找参数 2 是 int 而不是时间的问题。有没有更简单的方法可以做到这一点,我必须承认,如果你不能告诉我我根本不擅长时间戳。任何帮助表示赞赏。

DECLARE @DailyLimitOffsetTime TIME
IF (SELECT CONVERT(TIME,SYSUTCDATETIME())) > '15:00'
    SET @DailyLimitOffsetTime = DATEADD(hh,-15,CONVERT(TIME,SYSUTCDATETIME()))
ELSE
    SET @DailyLimitOffsetTime = DATEADD(hh,+9,CONVERT(TIME,SYSUTCDATETIME()))

IF @Limit <=
(
   SELECT COUNT(*)
   FROM dbo.fooTable
   WHERE offerId = @OfferID
   AND created_at > 
   DATEADD(hh,DATEPART(hh,-@DailyLimitOffsetTime),CONVERT(TIME,SYSUTCDATETIME()))
)
    SET @ErrorTypeID = 9400

我相信有更好的方法可以做到这一点,如果是这样,请分享。一如既往地感谢任何帮助。如果您需要有关此问题的任何进一步解释,请告诉我。这个有点乱

4

2 回答 2

1

DATEADD 函数中的第二个参数必须解析为 int

AND created_at > DATEADD(hh, -DATEPART(hh, @DailyLimitOffsetTime), CONVERT(TIME,SYSUTCDATETIME()))

或者

DECLARE @time time = CONVERT(TIME, SYSUTCDATETIME())
IF @Limit <=
(
   SELECT COUNT(*)
   FROM dbo.fooTable
   WHERE offerId = @OfferID
   AND created_at >
   CASE WHEN @time > '15:00' 
        THEN DATEADD(hh, 15,  DATEADD(hh, -DATEPART(hh, @time), @time))
        ELSE DATEADD(hh, 09,  DATEADD(hh, -DATEPART(hh, @time), @time)) END 
   END    
)
SET @ErrorTypeID = 9400
于 2013-01-17T09:49:44.837 回答
0

我不明白你在做什么,因为你总是会做同样的时间,而不是只考虑时间的日期。如果您尝试在某个位置的 UTC 时间在下午 3 点之后显示不同的日期,则您不希望出现这种情况。所以如果你想提前九个小时你不会因为你只是通过使用时间框架来计算当天。因此,如果是 1-16-12 的晚上 8 点,您可以将时间设置为早上 5 点。我认为您需要根据需要设置 DATETIME,而不仅仅是时间。

DECLARE @foo Datetime
    IF (SELECT CONVERT(TIME,SYSUTCDATETIME())) > '15:00'
        SET @foo = Dateadd(hh, datediff(hh, 0, sysutcdatetime()) -15, 0)
    ELSE
        SET @foo = Dateadd(hh, datediff(hh, 0, sysutcdatetime()) + 9, 0)

select @foo
于 2013-01-16T23:58:36.477 回答