実現したいこと
javaのResultSet.get~が端数処理(四捨五入)しないようにする
前提
javaのバージョンは、1.7です。
RDMSは、SQLServerです。バージョンは、18.4です。
発生している問題・エラーメッセージ
javaで、クエリを生成し、SQLServerで実行します。
以下のように、クエリ実行直後をログに出力して検証しました。
ResultSet rs = stmt.executeQuery()
logger.debug(stmt.toString());
logger.debug("取得結果 ={}",rs.getBigDecimal("取得する値"));
logger.debug("取得結果 ={}",rs.getString("取得する値"));
stmt.toString() 、つまりクエリの内容を、SQLServer(SSMS)のエディタ上で実行すると、
結果は「1329.695652」です。が、javaのログは、rs.getBigDecimalとrs.getStringのどちらも「1329.70」です。
SQLServer(SSMS)のエディタ上では「1329.695652」の値が、
なぜ、rs.getBigDecimalとrs.getStringのどちらも「1329.70」を返すのでしょうか?
実際のクエリは以下の通りです。{}には、javaが1をセットします。
<実際のクエリ>==============
SELECT
CAST( 最小終値 AS NUMERIC(10,5)) AS 最小終値, TRIM(基準日) AS 基準日,
件数, 市場コード
FROM (
SELECT
CAST(ROUND(AVG( 基準日終値 *(
CASE 基準年月
WHEN '202304' THEN 1
WHEN '202303' THEN {}
WHEN '202302' THEN {}
END )),10,1)
AS VARCHAR) AS 最小終値,
基準年月 AS 基準日,
COUNT(基準日終値) AS 件数,
市場コード
FROM
株式終値テーブル
WHERE 銘柄コード ='ZZZ' AND ( (基準日 between '20230400' AND '20230499') OR (基準日 between '20230300' AND '20230399') OR (基準日 between '20230200' AND '20230299') )
GROUP BY 基準年月 ,市場コード
UNION ALL
SELECT
CAST(ROUND(基準日終値,10,1) AS VARCHAR) AS 最小終値 , 基準日 AS 基準日, '1' AS 件数, 市場コード
FROM 株式終値テーブル
WHERE 銘柄コード = 'ZZZ' AND 基準日= '20230428' )
AS 終値
ORDER BY 最小終値, 市場コード , 基準日 desc
該当のソースコード
ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー