2016-08-03 8 views
-1

Ich benutze SQL Server 2000. Wenn eine neue Version dieses Problem lösen wird, werde ich aktualisieren.SQL Server: Arithmetische Funktion auf BIGINT verliert Genauigkeit

Betrachten Sie die folgenden Datensätze in einer bigint Spalte:

1000000000000000000 
1000000200000000000 
1000000200000100000 
1000000200000000001 
1000000200000000100 

Ich dachte, die folgende SELECT Anweisung 1 Datensatz ergeben würde, aber es kommt wieder mit einer leeren Menge:

SELECT * 
FROM table 
WHERE number/100 <> FLOOR(number/100) 

Wenn SQL Server bietet einen BIGINT Datentyp, sicherlich sollte es auch die Arithmetik behandeln?

+3

Wenn Sie ein Upgrade auf dem Tisch ist, warum nicht nur ein Upgrade? Das Jahr 2000 wurde nicht mehr unterstützt, um ein Jahrzehnt voranzutreiben. Bei deinem Beispiel sehe ich nicht, wo etwas nicht so funktioniert, wie es sein sollte. –

+0

Stimmen Sie mit @Sean Lange überein. Sie sollten mindestens 2008R2 sein, wenn dies eine ernsthafte Anwendung ist. – WPrecht

Antwort

4

Eine INT geteilt durch eine INT gibt eine INT zurück. Fügen Sie einfach eine Dezimalzahl in Ihrem denom

Declare @Table table (number bigint) 
Insert into @Table values 
(1000000000000000000), 
(1000000200000000000), 
(1000000200000100000), 
(1000000200000000001), 
(1000000200000000100) 

SELECT * FROM @table WHERE number/100. <> FLOOR(number/100.) 

Returns

mumber 
1000000200000000001 
+0

Nun, das ist funky. Das habe ich 2005, 2008, 2012 und 2014 versucht. Alle drei Versionen zeigen dieses Verhalten und die Berechnung ist die gleiche. –

+0

@SeanLange mit oder ohne die Dezimalstelle auf dem Nennwert? –

+0

SELECT * \t, Nummer/100. \t, FLOOR (Nummer/100.) \t, (Nummer/100.)/FLOOR (Nummer/100.) FROM @Tabelle WHERE Nummer/100. <> FLOOR (Nummer/100.) –

Verwandte Themen