2014-03-27 34 views
4

在Ruby:Postgres中真正的數學「模」操作?

-2 % 24 
=> 22 

在Postgres裏:

SELECT -2 % 24; 
?column? 
---------- 
     -2 

SELECT mod(-2,24); 
mod 
----- 
    -2 

我可以隨便寫一個我自己,但我很好奇的Postgres是否有一個真正的模運算,爲師後,相對於其餘部分。

+0

如果您不介意的問題是什麼_a真正模operation_包括或鏈接? –

+0

在這個問題的上下文中,我稱之爲「模數」操作在這裏返回一個叫做「r」的數字:http://en.wikipedia.org/wiki/Euclidean_division。像Common Lisp的'MOD'(與'REM'相反)。或者Ruby的'Fixnum#%'(而不是'Numeric#remaining')。這兩種操作都很重要,一種語言支持一種而不是另一種是一種弱點。 –

回答

4
SELECT MOD(24 + MOD(-2, 24), 24); 

將返回22,而不是-2

+0

行。我沒有嘗試過,但是如果第一個操作數是正數,它看起來也是有效的。太好了! –

0

看來,我不會找到任何東西更容易比:

CREATE OR REPLACE FUNCTION modulus(dividend numeric, divisor numeric) RETURNS numeric AS $$ 
DECLARE 
    result numeric; 
BEGIN 
    divisor := ABS(divisor); 
    result := MOD(dividend, divisor); 
    IF result < 0 THEN 
    result := result + divisor; 
    END IF; 
    RETURN result; 
END; 
$$ LANGUAGE plpgsql; 
+1

DBMS供應商似乎同意這裏:Oracle,SQL Server和MySQL返回與Postgres相同的東西。我不知道這是不是在SQL標準 –

+0

中指定的,我可以找到一個較短的解決方案,請參閱我的回答 – linqu