2016-08-03 6 views
-1

SQL Server 2000を使用しています。新しいバージョンでこの問題が解決する場合は、アップグレードします。私は、次のSELECT文は1つのレコードをもたらすだろうと思ったが、それが空集合で戻ってくるSQL Server:BIGINTの算術関数が精度を失う

1000000000000000000 
1000000200000000000 
1000000200000100000 
1000000200000000001 
1000000200000000100 

:SQL Serverの場合は

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

bigint列内の次のレコードを考えてみましょうBIGINTのデータ型を提供しますが、確かに算術演算も処理する必要がありますか?

+3

を小数点以下を追加する理由だけでアップグレードしませんか? 2000年は今、10年を踏み出すことを支持していません。あなたの例を考えれば、私は何かがうまくいかないとは思わない。 –

+0

@Sean Langeと同意します。これが重大なアプリケーションであれば少なくとも2008R2にあるはずです。 – WPrecht

答えて

4

INTをINTで割った値がINTを返します。アップグレードは、テーブルの上にある場合はちょうどあなたのdenomに

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

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

戻り

mumber 
1000000200000000001 
+0

まあ、それはファンキーです。私は2005、2008R2、2012、2014でこれを試しました。この3つのバージョンはすべてこの動作を示し、計算は同じです。 –

+0

@SeanLangeデンマークの小数点の有無は? –

+0

SELECT * \t、数値/ 100。 \t、フロア(数字/ 100) \t、(数字/ 100)/フロア(数値/ 100) FROM @テーブル番号/ 100。 <>フロア(番号/ 100。) –