在sql中使用时间戳

在sql中使用时间戳,sql,sql-server,tsql,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,SYSUTCDATET

我在一个存储过程中有一个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()))
我不断得到一个错误,即数据类型time对于减号运算符无效。我怎样才能绕过这个问题,使and子句起作用。我已经尝试过转换数据类型,我有点理解DATEADD(hh)的问题是希望param 2是int而不是time。有没有更简单的方法,我必须承认,如果你不知道我对时间戳不在行的话。感谢您的帮助

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
DECLARE@DailyLimitOffsetTime时间
如果(选择CONVERT(TIME,SYSUTCDATETIME())>“15:00”
SET@DailyLimitOffsetTime=DATEADD(hh,-15,CONVERT(TIME,SYSUTCDATETIME()))
其他的
SET@DailyLimitOffsetTime=DATEADD(hh,+9,CONVERT(TIME,SYSUTCDATETIME()))
如果@Limit
DATEADD(hh,DATEPART(hh,-@DailyLimitOffsetTime),CONVERT(TIME,SYSUTCDATETIME())
)
设置@ErrorTypeID=9400

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

我不明白你在做什么,因为你总是在同一个时间,而不是只考虑时间。当UTC时间在某个地点的下午3点之后时,如果您试图向前显示另一天,则不希望出现这种情况。因此,如果你想提前九个小时,你就不会这样做,因为你只是用时间框架来计算当天。因此,如果是12月1日下午8点,你会将时间设置为上午5点。我认为你需要为你想要的东西设置日期时间,而不仅仅是时间

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

我不明白你在做什么,因为你总是在同一时间,不考虑日期,只考虑时间。当UTC时间在某个地点的下午3点之后时,如果您试图向前显示另一天,则不希望出现这种情况。因此,如果你想提前九个小时,你就不会这样做,因为你只是用时间框架来计算当天。因此,如果是12月1日下午8点,你会将时间设置为上午5点。我认为你需要为你想要的东西设置日期时间,而不仅仅是时间

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

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

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

DECLARE@time=CONVERT(time,SYSUTCDATETIME())
如果@Limit
@time>'15:00'时的情况
然后是DATEADD(hh,15,DATEADD(hh,-DATEPART(hh,@time),@time))
ELSE DATEADD(hh,09,DATEADD(hh,-DATEPART(hh,@time),@time))结束
结束
)
设置@ErrorTypeID=9400

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

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

DECLARE@time=CONVERT(time,SYSUTCDATETIME())
如果@Limit
@time>'15:00'时的情况
然后是DATEADD(hh,15,DATEADD(hh,-DATEPART(hh,@time),@time))
ELSE DATEADD(hh,09,DATEADD(hh,-DATEPART(hh,@time),@time))结束
结束
)
设置@ErrorTypeID=9400

我要做的就是这样。我对可以购买的物品有限制。所有购买都存储在UTC时间。我想检查以确保24小时UTC区块中的所有购买都计入该检查。上面的if语句在一个变量中填充了hours,然后我以下面的方式使用这个变量。(见更新后的问题)我试图实现的是这一点。我对可以购买的物品有限制。所有购买都存储在UTC时间。我想检查以确保24小时UTC区块中的所有购买都计入该检查。上面的if语句在一个变量中填充了hours,然后我以下面的方式使用这个变量。(参见更新的问题)这仍然失败,并出现相同的错误。Msg 8117,级别16,状态1,过程CreateTransation,第160行操作数数据类型time对于减号运算符无效。即使添加转换(int,@DailyLimitOffsetTime)也无法处理以下错误:Msg 529,级别16,状态2,第6行不允许从数据类型int显式转换为时间。欢迎您…仅供参考,可能的替换转换(TIME,SYSUTCDATETIME())在强制转换(SYSUTCDATETIME()作为时间)上这仍然失败,并出现相同的错误。Msg 8117,级别16,状态1,过程CreateTransation,第160行操作数数据类型time对于减号运算符无效。即使添加转换(int,@DailyLimitOffsetTime)也无法处理以下错误:Msg 529,级别16,状态2,第6行不允许从数据类型int显式转换为时间。欢迎您…仅供参考,可能在强制转换(SYSUTCDATETIME()作为时间)时替换转换(TIME,SYSUTCDATETIME())