3

Microsoft SQL Server Mgmt studioでクエリを設定しましたが、[レート]列と[可変レート]列に関して興味深い結果が得られています。

Management Studioでクエリを実行すると、次の結果セットが表示されます。列の順序は次のとおりです。TradeID、Dealer、IssuanceDate、MaturityDate、Face、Rate、Proceeds、TxnCCY、VariableRate

 Trade ID                Dealer   IssuanceDate MaturityDate Face     Rate    Proceeds  TXN CCY Variable Rate
 PERNOD & RICARD            BAR   20121212    20121221  10000000    0.24    9999400 USD NULL
PUT_30 04821QAP6 1ML POOL   BAS   20121022    20130418  100000000   0.28    100000000   USD 0.2075

Management Studioの外部でバッチファイルでクエリを実行すると、次の結果セットが表示されます。

Trade ID                Dealer   IssuanceDate MaturityDate Face     Rate    Proceeds  TXN CCY    Variable Rate
PERNOD & RICARD;          BAR;20121212;        20121221;  10000000;0.23999999999999999;9999400;USD;
PUT_30 04821QAP6 1ML POOL;BAS;20121022;        20130418;  100000000;0.28000000000000003;100000000;USD;
       0.20749999999999999

SQL Server Management Studioが値を丸めているのに、バッチファイルが丸められていないのはなぜですか?バッチ抽出で丸められた値を確認する必要があります。エラーを受け取るためだけに、列のデータ型を10進数と実数に変更してみました。

誰かがこれを機能させ、抽出物に丸められた値を表示する方法について何か提案がありますか?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
ALTER PROCEDURE [dbo].[CALYON_TRADES_LIABILITIES_TEST]
-- Add the parameters for the stored procedure here
@BusDate datetime = NULL
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
 IF @BusDate is null
  BEGIN
DECLARE @yesterday datetime
set @yesterday = DATEADD(D, -1, GETDATE())
set @BusDate = CONVERT(datetime,
convert(varchar(2), datepart(month, @yesterday)) + '/' + convert(varchar(2),datepart
(day, @yesterday)) + '/' + convert(varchar(4), datepart(year, @yesterday))
)
END
Drop table dbo.VariableRateLiabilities
Create table dbo.VariableRateLiabilities
(TradeID VarChar(35) null,
Dealer VarChar(15) null,
IssuanceDate varchar (8) null,
MaturityDate varchar (8) null,
Face numeric (9) null,
Rate float null,
Proceeds numeric null,
TxnCCY VarChar (3) null,
VariableRate float null,
VariableRateDate varchar (8) null)
INSERT INTO dbo.VariableRateLiabilities SELECT DISTINCT
RPT.TradeName as TradeID,
RPT.DealerShortName as Dealer,
CONVERT(varchar(8), RPT.TxnValueDate, 112) as IssuanceDate,
CONVERT(varchar(8), RPT.MaturityDate, 112) as MaturityDate,
RPT.Face,
RPT.Rate,
RPT.Proceeds,
RPT.TxnCCY,
IRI.InterestIdxRate as VariableRate,
CONVERT (varchar (8), IRI.InterestIdxDate, 112) as VariableRateDate
From RPT_TradesIssuance RPT
INNER JOIN LiabilityTrades LT
ON RPT.Price = LT.Price
LEFT OUTER JOIN InterestRateIndexes IRI
ON LT.InterestRateCode = IRI.InterestRateCode
WHERE RPT.SPVId=12
AND RPT.MaturityDate > @BusDate
AND RPT.TxnValueDate <= @BusDate
select TradeId,Dealer,IssuanceDate,MaturityDate,Face,Rate,Proceeds,TxnCCY,VariableRate
from dbo.VariableRateLiabilities
where TradeId NOT LIKE 'PUT%'
UNION
select         a.TradeId,a.Dealer,a.IssuanceDate,a.MaturityDate,a.Face,a.Rate,a.Proceeds,a.TxnCCY,a.VariableRate
from dbo.VariableRateLiabilities a
where a.VariableRateDate in (select MAX(b.VariableRateDate) from      dbo.VariableRateLiabilities b where a.TradeID = b.TradeID)

ORDER BY Dealer,1
END
4

3 に答える 3

1

お金を扱う際に浮動小数点データ型を避けることができるなら、おそらくそうすべきです。データ型が表示されている場合は、floatそれを数値に置き換えてみてください。

一般的な意見に反して、任意の浮動小数点値を2桁に丸めることはできません。また、浮動小数点値を含む計算では、おそらくすべての値を浮動小数点に変換する必要があり、おそらく浮動小数点を返します。(これに関するSQL Serverのドキュメントを探しましたが、まだ見つかりませんでした。)

正しいデータ型を使用すると、問題の根本的な原因が修正されます。

適切なタイミングで明示的なキャストと丸めを行うことで実際の問題を回避できる可能性がありますが、誰もが毎回正確にそれを取得する必要があります。根本原因を修正すると、みんなの生活が楽になります。(cast(float_column_name as numeric(n,m)、ここで、「n」と「m」はアプリケーションに依存します。convert()キャストの代わりに選択できます。)

于 2012-12-14T20:20:02.927 に答える
1

テーブル定義は次のようになります。

CREATE TABLE dbo.VariableRateLiabilities (
    TradeID VARCHAR(35) NULL
    ,Dealer VARCHAR(15) NULL
    ,IssuanceDate VARCHAR(8) NULL
    ,MaturityDate VARCHAR(8) NULL
    ,Face NUMERIC(9) NULL
    ,Rate NUMERIC(18, 2) NULL
    ,Proceeds NUMERIC NULL
    ,TxnCCY VARCHAR(3) NULL
    ,VariableRate NUMERIC(18, 4) NULL
    ,VariableRateDate VARCHAR(8) NULL
);

また、データ挿入は次のようになります(元の値が浮動小数点数などであると仮定すると、CASTまたはが必要になりますCONVERT)。

INSERT INTO dbo.VariableRateLiabilities
SELECT  DISTINCT
        RPT.TradeName AS TradeID
        ,RPT.DealerShortName AS Dealer
        ,CONVERT(VARCHAR(8), RPT.TxnValueDate, 112) AS IssuanceDate
        ,CONVERT(VARCHAR(8), RPT.MaturityDate, 112) AS MaturityDate
        ,RPT.Face
        ,CAST(RPT.Rate AS NUMERIC(18, 2)) AS Rate
        ,RPT.Proceeds
        ,RPT.TxnCCY
        ,CAST(IRI.InterestIdxRate AS NUMERIC(18,4)) AS VariableRate
        ,CONVERT (VARCHAR(8), IRI.InterestIdxDate, 112) AS VariableRateDate
FROM    RPT_TradesIssuance RPT
INNER JOIN LiabilityTrades LT ON RPT.Price = LT.Price
LEFT OUTER JOIN InterestRateIndexes IRI ON LT.InterestRateCode = IRI.InterestRateCode
WHERE   RPT.SPVId = 12
        AND RPT.MaturityDate > @BusDate
        AND RPT.TxnValueDate <= @BusDate;

このようなand列を試してみるとどうなるかわかりません。これは、andテーブルにあるデータ型によってCAST異なるためです。彼らもそうですか?RateVariableRateRPT_TradesIssuanceInterestRateIndexesFLOAT

(データ型としてNUMERIC(18, 2)とを選択したことに注意してください。ただし、これらの列に格納されるデータに応じてそれらを調整する必要があります。)NUMERIC(18, 4)

于 2012-12-14T20:34:20.550 に答える
0

変数を丸める前に、FLOAT変数をに変換する必要があります。DECIMAL

于 2012-12-14T20:17:17.380 に答える