【问题标题】:Modulo operator, how to do Binary % bigint?模运算符,如何做二进制 % bigint?
【发布时间】:2015-08-06 13:54:52
【问题描述】:

MSDN says 模数的有效类型是

整数和货币数据类型类别中的数据类型,或数字数据类型

BINARY 不在列表中,但我仍然可以做

DECLARE 
  @a bigint = 1, 
  @b bigint = 2, 
  @bin binary(16)

SET @bin = cast(@a AS binary(8)) + cast(@b AS binary(8))

PRINT @bin % 2147483647

BIGINT 在列表中,但这不起作用:

PRINT @bin % 9223372036854775807

我的问题,可以做 BINARY % BIGINT 吗?

【问题讨论】:

    标签: sql-server binary-data modulo bigint


    【解决方案1】:

    在您的第二个示例中,SQL 服务器将 9223372036854775807 隐式视为 numeric(十进制),因此 % 运算符不支持。

    您只需先将其转换为bigint

    DECLARE 
      @a bigint = 1, 
      @b bigint = 2, 
      @bin binary(16)
    
    SET @bin = cast(@a AS binary(8)) + cast(@b AS binary(8))
    
    PRINT @bin % 2147483647
    PRINT @bin % CONVERT(bigint, 9223372036854775807)
    

    [我认为] 发生这种情况是因为 numeric (decimal) 的类型优先级高于 bigint

    【讨论】:

    • 是的,它有效。谢谢你。这是违反直觉的,为什么它将 max bigint 转换为 numeric。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多