我在存储过程中有一个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()))
我一直收到一个错误,即数字类型时间对于减号运算符无效。我怎样才能解决这个问题,使得和子句有效。我试过转换数据类型,我有点理解DATEADD(hh)正在寻找param 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
我确信有更好的方法可以做到这一点,如果有,请分享方式。一如往常任何帮助表示赞赏。如果您对此问题有任何进一步的解释,请告诉我。这个有点乱。
答案 0 :(得分:1)
DATEADD函数中的第二个参数必须解析为int
AND created_at > DATEADD(hh, -DATEPART(hh, @DailyLimitOffsetTime), CONVERT(TIME,SYSUTCDATETIME()))
OR
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
答案 1 :(得分:0)
我不知道你在做什么,因为你总会在同一时间做,而不是只考虑时间。如果您在某个位置的UTC时间晚于下午3点之后尝试显示不同的一天,则您不希望这样。因此,如果您想提前9个小时,那么您将不会因为您只使用时间范围来计算当天。因此,如果它是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