在sql中使用时间戳

时间:2013-01-16 22:49:35

标签: sql sql-server tsql

我在存储过程中有一个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

我确信有更好的方法可以做到这一点,如果有,请分享方式。一如往常任何帮助表示赞赏。如果您对此问题有任何进一步的解释,请告诉我。这个有点乱。

2 个答案:

答案 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