Mod отрицательные числа в SQL так же, как excel

У меня возникли проблемы с репликацией функции mod в SQL sever.

в excel, mod (-3, 7) = 4. Но в SQL, -3 % 7 = -3

Я использую % неправильно, или SQL делает mod по-другому?

3 ответов


Это даст результат между 0 и n-1 как для положительных, так и для отрицательных значений x:

((x % n) + n) % n

Ну модулярной арифметики делается классы эквивалентности целых чисел, поэтому ни Excel, ни какие-либо СУБД "doing % неправильно". Если вам нужен представитель между 0 и 6, вы всегда можете сделать

select (-3 % 7) + 7;

Dare, чтобы быть скучным (и поздно на вечеринку).

declare @Modulus as Int = 7
declare @Samples as Table ( Value Int )

insert into @Samples ( Value ) values ( -12 ), ( -3 ), ( 0 ), ( 3 ), ( 13 ), ( 70 )

select Value,
  case Sign( Value )
    when 1 then Value % @Modulus
    when -1 then Value % @Modulus + @Modulus
    else 0
    end as Modulus
  from @Samples