1

小数点の左側に最大 5 を返し、常に右側に 3 を返したい変数があります。

CONVERT(VARCHAR(14),CONVERT(DECIMAL(8,3),
        DATEDIFF(MILLISECOND,@ProcessTime,GETDATE()))/@OneThousand)

現在、変数は次のように定義されています

DECLARE @ProcessTime DATETIME 
DECLARE @OneThousand DECIMAL(8,3)
SET @OneThousand = 1000.000

これは常に次のようなものを返します

0.003000000000

左の関数で問題を解決できると思いますが、私の質問は、なぜこれが起こるのかということです。定義された 10 進数の最小変数@OneThousandが 3 の場合、戻り値は 3 桁の小数点を持つべきではありませんか?

4

2 に答える 2

2

の除算の結果は、これを見るためにのデータ型を与えDECIMAL(8,3)ますDECIMAL(8,3)DECIMAL(20,12)

DECLARE @ProcessTime DATETIME =getdate()
DECLARE @OneThousand DECIMAL(8,3)
SET @OneThousand = 1000.000

DECLARE @v SQL_VARIANT

SET @v = CONVERT(DECIMAL(8,3),
        DATEDIFF(MILLISECOND,@ProcessTime,GETDATE()))/@OneThousand

SELECT
    CAST(SQL_VARIANT_PROPERTY(@v, 'BaseType') AS VARCHAR(30)) AS BaseType,
    CAST(SQL_VARIANT_PROPERTY(@v, 'Precision') AS INT) AS Precision,
    CAST(SQL_VARIANT_PROPERTY(@v, 'Scale') AS INT) AS Scale

理由を説明する BOL セクションdecimal(20,12) はこちら

Operation:        e1 / e2
Result precision: p1 - s1 + s2 + max(6, s1 + p2 + 1)
Result scale:     max(6, s1 + p2 + 1)

だからあなたの場合

Result precision: 8 - 3 + 3 + max(6, 3 + 8 + 1) = 20
Result scale:     max(6, 3 + 8 + 1)             = 12
于 2011-04-29T19:47:56.347 に答える
1

試す...

SELECT CAST(DATEDIFF(ms, @processDate, GETDATE()) / 1000.000 AS decimal(8,3))
于 2011-04-29T20:04:37.150 に答える