Function SQL函数-变量将自身设置为随机值

Function SQL函数-变量将自身设置为随机值,function,tsql,variables,Function,Tsql,Variables,我创建了下面的函数,将@FCST和@QTY值更改为随机选择似乎是随机的。下面是调试程序返回@FCST错误值的示例。由于@FCST是9.53,我预计它会返回9.53。 编辑:错误计算@QTY的示例 一切似乎都是正确的-通过运行下面的SQL,您可以看到发生了什么。 我怀疑混淆的是数字末尾的e-002和e-001;这只是SQL试图显示浮点数的值;由于浮点运算的工作原理,一些数字的计算结果与您预期的略有出入,然后为了使它们可读,SQL将显示带有指数的数字 declare @MAT VARCHAR(30

我创建了下面的函数,将@FCST和@QTY值更改为随机选择似乎是随机的。下面是调试程序返回@FCST错误值的示例。由于@FCST是9.53,我预计它会返回9.53。

编辑:错误计算@QTY的示例

一切似乎都是正确的-通过运行下面的SQL,您可以看到发生了什么。 我怀疑混淆的是数字末尾的e-002和e-001;这只是SQL试图显示浮点数的值;由于浮点运算的工作原理,一些数字的计算结果与您预期的略有出入,然后为了使它们可读,SQL将显示带有指数的数字

declare @MAT VARCHAR(30) = '50309120000W'
,@LCUT DATE = '2014-10-26'
, @QS DATE =  '2014-10-27'
,@STAT FLOAT = 9.5399999999999999e-002
, @MCA FLOAT = 9.5399999999999999e-002


DECLARE @HD DATE
DECLARE @ED DATE
DECLARE @FCST FLOAT
DECLARE @QTY FLOAT 
DECLARE @YRS FLOAT

SET @ED = 
(
    SELECT TOP 1 [EO_END_DATE] 
    FROM (SELECT '2019-02-28' [EO_END_DATE], @MAT [W_PART_NUMBER], @LCUT [APPROVED_DATE] ) X
    WHERE [W_PART_NUMBER] = @MAT
    AND [APPROVED_DATE] <= @LCUT
    ORDER BY [EO_END_DATE] DESC
)
SET @HD =DATEADD(YEAR,2,@QS)


SET @FCST = (CASE WHEN @MCA <= @STAT THEN @MCA ELSE @STAT END)
SELECT @FCST

SET @FCST = (CASE WHEN @FCST <.5 THEN .5 ELSE @FCST END)
SELECT @FCST

SET @YRS = (DATEDIFF(DAY,@HD,@ED) + 730)/365
SET @QTY = @FCST * @YRS
SELECT @FCST, @YRS, @QTY

SET @QTY = (CASE WHEN @ED<=@HD THEN 0 ELSE @QTY END)
SELECT @QTY, @ED, @HD

隐马尔可夫模型。。。那不是9.53。。这是9.53 x 10^-2=9.53 x 0.01。。这是0.0953,结果是5x10^-1=5x0.1=0.5。。这就是你在更新中指定的,当它小于0.5时,数量是21.345+。。应该是什么?是的,我读错了浮点数的值。谢谢,所以是的,我读错了浮点数的值。非常感谢。
declare @MAT VARCHAR(30) = '50309120000W'
,@LCUT DATE = '2014-10-26'
, @QS DATE =  '2014-10-27'
,@STAT FLOAT = 9.5399999999999999e-002
, @MCA FLOAT = 9.5399999999999999e-002


DECLARE @HD DATE
DECLARE @ED DATE
DECLARE @FCST FLOAT
DECLARE @QTY FLOAT 
DECLARE @YRS FLOAT

SET @ED = 
(
    SELECT TOP 1 [EO_END_DATE] 
    FROM (SELECT '2019-02-28' [EO_END_DATE], @MAT [W_PART_NUMBER], @LCUT [APPROVED_DATE] ) X
    WHERE [W_PART_NUMBER] = @MAT
    AND [APPROVED_DATE] <= @LCUT
    ORDER BY [EO_END_DATE] DESC
)
SET @HD =DATEADD(YEAR,2,@QS)


SET @FCST = (CASE WHEN @MCA <= @STAT THEN @MCA ELSE @STAT END)
SELECT @FCST

SET @FCST = (CASE WHEN @FCST <.5 THEN .5 ELSE @FCST END)
SELECT @FCST

SET @YRS = (DATEDIFF(DAY,@HD,@ED) + 730)/365
SET @QTY = @FCST * @YRS
SELECT @FCST, @YRS, @QTY

SET @QTY = (CASE WHEN @ED<=@HD THEN 0 ELSE @QTY END)
SELECT @QTY, @ED, @HD