SQL将十进制数(18,4)乘以十进制数(3,2)返回十进制数(18,4)
我看到很多人的帖子都有类似的问题,但我尝试了他们所有的解决方案,没有一个对我有效。希望你们能指出我的错误 SQLSQL将十进制数(18,4)乘以十进制数(3,2)返回十进制数(18,4),sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我看到很多人的帖子都有类似的问题,但我尝试了他们所有的解决方案,没有一个对我有效。希望你们能指出我的错误 SQL SELECT --Raw Values Hours, --RESULT: 24.0000 StartStops, --RESULT: 0.0000 --Equation without CAST/ROUND ((Hours * 1.00)) AS "WhatIf Hours", --RESULT: 24.000000 ((StartS
SELECT
--Raw Values
Hours, --RESULT: 24.0000
StartStops, --RESULT: 0.0000
--Equation without CAST/ROUND
((Hours * 1.00)) AS "WhatIf Hours", --RESULT: 24.000000
((StartStops * 1.00)) AS "WhatIf Starts", --RESULT: 0.000000
--CAST output of equation
CAST((Hours * 1.00) as DECIMAL(18,4)) AS "WhatIf Hours", --RESULT: Arithmetic overflow error converting numeric to data type numeric.
CAST((StartStops * 1.00) as DECIMAL(18,4)) AS "WhatIf Starts", --RESULT: Arithmetic overflow error converting numeric to data type numeric.
--CAST each input of equation
CAST(Hours as DECIMAL(18,4)) * CAST(1.00 as decimal(18,4)) AS "WhatIf Hours", --RESULT: 24.00000000
CAST(StartStops as DECIMAL(18,4)) * CAST(1.00 AS decimal(18,4)) AS "WhatIf Starts", --RESULT: 0.00000000
--ROUND output of equation
ROUND((Hours * 1.00), 4) AS "WhatIf Hours", --RESULT: 24.000000
ROUND((StartStops * 1.00), 4) AS "WhatIf Starts" --RESULT: 0.000000
FROM
MyTable
WHERE
ID = 1
期望的结果将是算术输出为DECIMAL(18,4)
,因为这是I列将用值更新的类型。有人能帮忙吗
更新:创建表格
CREATE TABLE [dbo].[MyTable](
[ID] [int] NOT NULL,
[Hours] [decimal](18, 4) NULL,
[StartStops] [decimal](18, 4) NULL,
[Updated] [datetime] NULL,
[UpdatedBy] [varchar](50) NULL,
) ON [PRIMARY]
更新2
这张照片让你们知道我没疯
试试看
CAST((ROUND(Hours * 1.00, 4)) as DECIMAL(18,4)) AS "WhatIf Hours"
您正在获得算术溢出,因为您试图将小数点后6位的小数转换为小数点后4位的小数。先把它四舍五入到4位就可以了
你也可以这样做
CAST((CAST(Hours as DECIMAL(18,4)) * CAST(1.00 as DECIMAL(18,4))) as DECIMAL(18,4))
试一试
您正在获得算术溢出,因为您试图将小数点后6位的小数转换为小数点后4位的小数。先把它四舍五入到4位就可以了
你也可以这样做
CAST((CAST(Hours as DECIMAL(18,4)) * CAST(1.00 as DECIMAL(18,4))) as DECIMAL(18,4))
问题可能出在您的设置中。请参见以下示例: 运行:
将数字\u ROUNDABORT设置为打开
声明@num decimal(18,4)=24.0000
选择cast(@num*1.00)作为十进制(18,4))
导致将数值转换为数据类型数值时出现算术溢出错误。然而,运行
设置数值\u ROUNDABORT关闭
声明@num decimal(18,4)=24.0000
选择cast(@num*1.00)作为十进制(18,4))
给出24.0000
根据官方MSN文档(),您可以运行以下代码:
DECLARE@NUMERIC_ROUNDABORT VARCHAR(3)=“OFF”;
如果((8192&@@OPTIONS)=8192)设置@NUMERIC_ROUNDABORT='ON';
选择@NUMERIC\u ROUNDABORT作为NUMERIC\u ROUNDABORT代码>
检查您的系统设置。问题可能出在您的设置中。请参见以下示例:
运行:
将数字\u ROUNDABORT设置为打开
声明@num decimal(18,4)=24.0000
选择cast(@num*1.00)作为十进制(18,4))
导致将数值转换为数据类型数值时出现算术溢出错误。然而,运行
设置数值\u ROUNDABORT关闭
声明@num decimal(18,4)=24.0000
选择cast(@num*1.00)作为十进制(18,4))
给出24.0000
根据官方MSN文档(),您可以运行以下代码:
DECLARE@NUMERIC_ROUNDABORT VARCHAR(3)=“OFF”;
如果((8192&@@OPTIONS)=8192)设置@NUMERIC_ROUNDABORT='ON';
选择@NUMERIC\u ROUNDABORT作为NUMERIC\u ROUNDABORT代码>
检查您的系统设置。什么是hours
和startstops
列的数据类型?已添加创建表。您在查询中为什么不将所有内容都转换为十进制(18,4)?如果您已经尝试过了,会发生什么?请参阅查询的第6行。我试图转换算术的输出,但得到了一个溢出错误。你的意思是把方程的每一部分都投进去吗?我无法复制。1) 你的创造。2) 将值(1,24.0,0,GETDATE(),“”)插入dbo.MyTable(ID,Hours,startstop,Updated,UpdatedBy)
3)您可以选择。如果问题在于不同的乘数,请给我们一个失败的例子。hours
和startstop
列的数据类型是什么?创建表已经添加了为什么在查询中不将所有内容都转换为十进制(18,4)?如果您已经尝试过了,会发生什么?请参阅查询的第6行。我试图转换算术的输出,但得到了一个溢出错误。你的意思是把方程的每一部分都投进去吗?我无法复制。1) 你的创造。2) 将值(1,24.0,0,GETDATE(),“”)插入dbo.MyTable(ID,Hours,startstop,Updated,UpdatedBy)
3)您可以选择。如果问题在于不同的乘数,请给我们一个失败的例子。