2012-04-04 5 views
1

ここに少し問題があります。 私は定期的にMySQLテーブルの通貨の自動更新を行っています。生成されたクエリの 一部は次のとおりです。MySQLクエリの不思議なリターン

UPDATE ara_curr SET 
curr_xchange=REPLACE(CONVERT(CONVERT('1.60739',DECIMAL(9,5))/CONVERT('10000',DECIMAL(9,5)),DECIMAL(9,5)),'.',','), 
curr_rev_xchange=REPLACE(CONVERT('6221.27',DECIMAL(9,5)),'.',',') 
WHERE curr_name='IDR'; 

私はオンラインサービスから値を取得します。私はそれを打破する場合は、このクエリは、私は、例えば、これらの値を直接クエリを実行しようとした場合の変換は、これらの

REPLACE(CONVERT('6221.27',DECIMAL(9,5)),'.',',') = 6221,27000 
CONVERT('1.60739',DECIMAL(9,5)) = 1,60739 
CONVERT('10000',DECIMAL(9,5)) = 9999,99999 
CONVERT(CONVERT('1.60739',DECIMAL(9,5))/CONVERT('10000',DECIMAL(9,5)),DECIMAL(9,5)) = 0,00016 

を返し、

Out of range value for column (null) at row 1 

が返されます

UPDATE ara_curr SET curr_xchange='0,00016', curr_rev_xchange='6221,27000' WHERE curr_name='IDR'; 

完全に正常に実行されます。

これについてのアイデアは?

答えて

0

curr_xchangeとcurr_rev_xchangeはどのデータ型ですか?

私はあなたのクエリを実行すると、バイナリデータとして結果を返します。 おそらく、結果を中心にCASTでこの変更を試すことができます。

UPDATE ara_curr SET 
curr_xchange=CAST(REPLACE(CONVERT(CONVERT('1.60739',DECIMAL(9,5))/CONVERT('10000',DECIMAL(9,5)),DECIMAL(9,5)),'.',',') AS CHAR), 
curr_rev_xchange=CAST(REPLACE(CONVERT('6221.27',DECIMAL(9,5)),'.',',') AS CHAR) 
WHERE curr_name='IDR'; 
+0

まあ、curr_xchangeとcurr_rev_xchangeはVARCHARです。 しかし、キャスティングは機能しません。 なぜ彼らはDECIMALとして設定されていなかったのか分かりませんが、大きな問題はありません。 – nnikolov06

0

CONVERTの代わりにCASTを使用してみてください:

UPDATE ara_curr 
SET  REPLACE(CAST(CAST('1.60739' AS DECIMAL(9, 5))/CAST('10000' AS DECIMAL(9, 5)) AS DECIMAL(9, 5)), '.', ',') AS curr_xchange 
     , REPLACE(CAST('6221.27' AS DECIMAL(9, 5)), '.', ',') AS curr_rev_xchange 
WHERE curr_name = 'IDR'; 

また、あなたはそれが許容範囲を超えるようDECIMAL(9, 5)として10000を鋳造し、いくつかのトラブルに実行されることがあります。代わりにDECIMAL(10, 5)にキャストしてください。

+0

私はデータ型を以前のvarcharから10進数に変更しました。だから、varchar問題へのキャストは消えてしまった。 10000に9,5小数点以下のキャストの問題はありませんが、あなたは絶対に正しいです。 9999,99999に出力します。ありがたいことに、これは使用されないため取り除かれた通貨の1つでした。私たちは、そのような高い転換価値を持たない5-6(おそらく)の通貨を抱えていました。 アドバイスをいただきありがとうございます。それに気づき、次回にこのような問題について覚えています。 – nnikolov06