总和(30/365)未产生预期结果

时间:2018-10-02 00:15:26

标签: sql sql-server sql-server-2012

是否有更好的方法来计算结果:

我想要的是30/365 = 0.0821917808的结果,因此我可以在进一步的计算中使用它。在脚本中生成时,我得到零。下面是产生结果的一种方法,但是必须有更好的方法。

任何建议都将受到欢迎。谢谢大家。

CREATE TABLE [dbo].[_DOS_SCORE] (
[SCORE]         [DBO].[EXPCURRENCY] DEFAULT ((0.00)),
[YEAR]          [DBO].[EXPCURRENCY] DEFAULT ((0.00)),
[RESULT]        [DBO].[EXPCURRENCY] DEFAULT ((0.00)),
[LAST_MODIFIED] DATETIME DEFAULT (GETDATE()) )


INSERT INTO [_DOS_SCORE] (SCORE, YEAR)
VALUES
(30,365),
(60,365)

UPDATE [_DOS_SCORE] SET RESULT = SCORE/YEAR

SELECT * FROM [_DOS_SCORE]

4 个答案:

答案 0 :(得分:1)

使用数字数据类型

declare @DOS_SCORE as table (SCORE numeric(18,10) default 0, YEAR numeric(18,10) default 0, RESULT numeric(18,10) default 0,LAST_MODIFIED datetime default getdate())




INSERT INTO @DOS_SCORE (SCORE, YEAR)
VALUES
(30,365),
(60,365)

UPDATE @DOS_SCORE SET RESULT = SCORE/YEAR

SELECT * FROM @DOS_SCORE

结果是

SCORE   YEAR    RESULT  LAST_MODIFIED
30.0000000000   365.0000000000  0.0821917808    2018-10-02 10:36:25.943
60.0000000000   365.0000000000  0.1643835616    2018-10-02 10:36:25.943

答案 1 :(得分:1)

步骤1:将列RESULT的数据类型从类型EXPCURRENCY更改为适当的decimal(P, S)数据类型。查看Microsoft SQL Server documentation on decimal precision, scale, and length

后,应仔细选择PS的含义

(除非您了解使用不精确的数据类型的含义,否则请不要使用float。对于任何{{1},货币都不适合使用 }数据类型。)

第2步:您可能需要以float的身份进行计算。这将首先将任何SELECT 1.0 * SCORE / YEAR的值转换为int(因为decimal / int的结果也被int截断了)。

第3步:检查您的数据类型。对于名为intEXPCURRENCY的列,SCORE似乎是一种非常奇怪的数据类型。

答案 2 :(得分:1)

Microsoft Docs

  

如果将整数除数除以整数除数,则结果是整数,其结果的任何小数部分都会被截断。

您的参数之一必须是小数。例如:SELECT 30.0 / 365返回0.082191

如果需要将此值存储在字段/属性中,请使用@ErikE并使用DECIMAL(A,B)数据类型。

答案 3 :(得分:0)

SQL摆弄Money而不是ExpCurrency

http://sqlfiddle.com/#!18/3cf36c/1

 - SCORE    YEAR    RESULT  LAST_MODIFIED
 - 30       365     0.0821  2018-10-02T00:27:25.893Z
 - 60       365     0.1643  2018-10-02T00:27:25.893Z

由于没有太多有关ExpCurrency的信息,所以很难说。